neo4j cypher保持路径强加的排序,以便稍后在查询中使用

时间:2017-07-31 11:40:49

标签: neo4j cypher

我正在使用像

这样的查询
MATCH p=((:Start)-[:NEXT*..100]->(n))
WHERE ALL(node IN nodes(p) WHERE ...)
WITH DISTINCT n WHERE (n:RELEVANT)
...
RETURN n.someprop;

我希望通过-[:NEXT]->关系的方向产生自然排序的结果。 但是第三行中的WITH扰乱了这种排序。问题是,我需要使用with到1.过滤:RELEVANT节点和2.只获得不同的节点。

有没有办法保留订购?也许在路径上分配数字排序并稍后在ORDER BY重复使用?不知道怎么做。

2 个答案:

答案 0 :(得分:2)

您要求使用不同的节点,这表明该节点可能可以通过多个路径到达,因此可能存在于距起始节点多个距离处。

您应该在每个min()的路径长度上使用max()(或n,具体取决于您的要求),而不是使用DISTINCT。由于这些是聚合函数,因此每个n只能获得一行。

MATCH p=((:Start)-[:NEXT*..100]->(n:RELEVANT))
WHERE ALL(node IN nodes(p) WHERE ...)
WITH n, min(length(p)) as distance
WITH n 
ORDER BY distance
...
RETURN n.someprop;

答案 1 :(得分:1)

如果您从WHERE移除WITH条款并将标记:RELEVANT放在MATCH中?也许WHERE导致了问题......试试这个:

MATCH p=((:Start)-[:NEXT*..100]->(n:RELEVANT))
WHERE ALL(node IN nodes(p) WHERE ...)
WITH DISTINCT n
...
RETURN n.someprop;