Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher:分层排序_Neo4j_Cypher - Fatal编程技术网

Neo4j Cypher:分层排序

Neo4j Cypher:分层排序,neo4j,cypher,Neo4j,Cypher,我是新来的。我能够创建一个地理区域(从世界到大陆,从国家到地区)及其人口网络。 您可以使用此命令复制它,或检查控制台的链接: 我还可以使用以下命令计算每个地理区域的总人口: MATCH (n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*0..]->(g2:Geo) RETURN g2.name AS Geography, SUM(toFloat(n.amount)) AS Population ORDER BY Population

我是新来的。我能够创建一个地理区域(从世界到大陆,从国家到地区)及其人口网络。

您可以使用此命令复制它,或检查控制台的链接:

我还可以使用以下命令计算每个地理区域的总人口:

MATCH (n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*0..]->(g2:Geo)
RETURN g2.name AS Geography, SUM(toFloat(n.amount)) AS Population
ORDER BY Population DESC
然而,我对结果的分类并不满意:

如您所见,美利坚合众国位于EMEA和欧洲之间。在显示结果之前,是否有办法首先按“归属”层次结构进行排序?此外,尽管我所有的数据最多只有3个小数,但我不明白为什么SUM()命令返回的小数数太多


谢谢您的帮助。

当然,您应该能够按照路径的长度进行排序:

MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*0..]->(g2:Geo)
RETURN g2.name AS Geography, SUM(toFloat(n.amount)) AS Population
ORDER BY length(path) ASC, Population DESC
我想你会得到很多小数,因为。我认为你应该能够做到:

ROUND(SUM(toFloat(n.amount)) * 1000.0) / 1000.0
编辑:

您是对的,您需要按顺序添加路径长度:

MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*1..]->(g2:Geo)
RETURN g1.name AS Geography, SUM(toFloat(n.amount)) AS Population, length(path) AS path_length
ORDER BY length(path) ASC, Population DESC 
是的,你绝对正确,你的道路需要以成为世界而结束。您可以通过匹配
(g2:Geo{name:'World'})
来实现这一点,类似于我在评论中所建议的方式,或者如果您将来碰巧有更多根节点(也许我们会在月球或火星上殖民!),您可以这样做:

MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*]->(g2:Geo)
WHERE NOT((g2:Geo)-[:BELONG_TO]->())
RETURN g1.name AS Geography, SUM(toFloat(n.amount)) AS Population, length(path) AS path_length
ORDER BY length(path) ASC, Population DESC 

这意味着我们只需要g2不属于任何东西的路径。否则,
g2
可能是,例如,
Europe

感谢您的快速回复@brian underwood。您的查询在控制台中不起作用。您需要返回中的
长度(路径)
路径
,才能对其进行排序。因此,新的查询是
MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[levels:begin_TO*0..]>(g2:Geo)返回g2.name作为Geography,SUM(toFloat(n.amount))作为Population,length(path)作为length ORDER BY length DESC,Population DESC
,结果现在显示所有不同的路径。例如,我现在在前10个条目中有3次“世界”。所以这仍然不好。我可能需要结合最大值和长度。新的查询是:
MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[:归属于*0..]>(g2:Geo)返回g2.name作为Geography,MAX(Length(path))作为Length,SUM(toFloat(n.amount))作为Population ORDER BY Length DESC,Population DESC
注意,我将英国划分为更小的区域。因此,长度与诺拉姆或非洲相同。所以这仍然不是我想要的解决方案。有没有办法告诉Neo4j从“world”节点开始并从那里排序?当然,如果您输入一个
其中g2.name='world'
MATCH path=(n:Population)-[r:LIVE_IN]->(g1:Geo)-[:BELONG_TO*]->(g2:Geo)
WHERE NOT((g2:Geo)-[:BELONG_TO]->())
RETURN g1.name AS Geography, SUM(toFloat(n.amount)) AS Population, length(path) AS path_length
ORDER BY length(path) ASC, Population DESC