假设我有一个节点树,看起来像这样:
哪里这些数字对应于我通常想按 排序的某个值. (可能是时间,也可能是某种分数,无论如何。)
如果我仅按该数字返回它们,我当然会得到这种排序:
1, 2, 3, 4, 5, 6, 7, 8, 9
这通常很好,但除了这种类型之外,我还想应用 的约束。 parent 总是在 child 之前排序 .所以我真正想要的是这种:
3, 2, 1, 4, 5, 6, 7, 8, 9
你可以看到这看起来几乎一样;我们刚刚颠倒了
1, 2, 3
的顺序至 3, 2, 1
.有没有办法通过 Neo4j Cypher 查询来实现这种排序?
—
这是一个可以使用此树的实时控制台示例:
http://console.neo4j.org/r/l9mav2
到目前为止,这是我的查询:
MATCH path=( ({i: 3}) <-[:parent*0..]- (node) )
RETURN node, node.i, LENGTH(path)
我只是不确定如何使用此信息:
ORDER BY node.i
,我得到第一个排序。 ORDER BY LENGTH(path)
,太嚣张了。例如。 9
之前 5, 6, 7, 8
. 这可能吗?谢谢!
最佳答案
您可以组合这两个值来表示您的排序顺序,只需给 parent 一个更高的优先级:
MATCH path =((root:Node { i: 3 })<-[:parent*0..]-(node:Node))
RETURN node, node.i, LENGTH(path)
ORDER BY LENGTH(path)+ node.id *10
http://console.neo4j.org/r/ijeqlv
返回
+--------------------------------------+
| node | node.i | LENGTH(path) |
+--------------------------------------+
| Node[3]{i:3} | 3 | 0 |
| Node[2]{i:2} | 2 | 1 |
| Node[1]{i:1} | 1 | 2 |
| Node[4]{i:4} | 4 | 1 |
| Node[5]{i:5} | 5 | 2 |
| Node[6]{i:6} | 6 | 2 |
| Node[7]{i:7} | 7 | 2 |
| Node[8]{i:8} | 8 | 3 |
| Node[9]{i:9} | 9 | 1 |
+--------------------------------------+
9 rows
32 ms
关于graph - Neo4j 密码 : topological sort in addition to regular sort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23377222/