2017-03-09 142 views
1

使用Neo4j/Cypher,我有一个相当小的数据集(290个节点),只包含一种类型的标签(:县)。基于属性计算的组节点

它们的性质是这样的:县({countyCode,countyName,人口})。 这里有一个索引:County.countyCode

每个:县与1 + N其他:县有关的:ADJACENT_TO。

我试图实现是要找到适合的群体性质的给定值范围内的各县的组合(比如最小100000,最大120000)。三个或三个以上的县

与查询下面,我就得到了如发现对,但不是组合。

MATCH x = (a:County)-[:ADJACENT_TO]->(b:County) 
WHERE reduce(totalPopulation = 0, n IN nodes(x)| totalPopulation + n.population) >= 100000 
AND reduce(totalPopulation = 0, n IN nodes(x)| totalPopulation + n.population) <= 120000 
RETURN x, b.countyName, a.countyName, 
reduce(totalPopulation = 0, n IN nodes(x)| totalPopulation + n.population) AS reduction 

的最终目标是要找到的给定的标准范围内的降低,即,1个... N县独特组合:县(y)和:县(x)被联合县(Z),但不包括:县(w),因为它可能与县(v)有不同的组合。

没有县可以组合,其中“核心”县不直接存在:ADJACENT_TO定县。

我很感谢任何答案和指引,以帮助我的方式。

编辑: 经过大量搜索我认为什么我想要实现的是所谓的“聚类分析”,但我一直无法弄清楚如何创建群集(我所说的以上组) ,因此分析还有更远的距离。也许这个术语有助于澄清我所追求的。

+0

结果什么是“核心”县?你能举一个例子说明你希望这个分组是如何工作的吗? – cybersam

+0

我并不知道在Cypher中生成所有可能的组合的方法,尽管我已经将它作为对APOC过程的功能请求添加了。我认为您的要求中较难的部分是根据不同城市使用的组合限制某个城市的组合。这肯定需要重新检查,或者需要更好的定义限制应该如何工作。先到先得? – InverseFalcon

+0

对不起,在自己的世界里很容易失明。一个“核心”县将是与所有其他县相邻的县。 假设我们有县A,B和C.A与B和C都相邻,但B和C不是(必然)彼此相邻。那么A就是“核心”县。 –

回答

0

我去的解决方案是密码查询和PHP代码的组合。

我开始得到:County -nodes之间的所有关系,并运行一个阵列排列在PHP获取可能的变化。

从这些变化中,我创建了:Cluster - 与:Contains关系到相应:Counties的节点。

然后我给每个:Cluster排名基于机群组合人口。

然后我遍历了:Cluster的选择排名最高的,和未标示previoulsly,删除所有其他:Cluster的与相关的高级:Cluster一个:County

所以,最后 - 我没有找到一种方法来查询的Neo4j与CYPHER找我wanted-

相关问题