neo4j cypher保留path强加的顺序,以便稍后在查询中使用

neo4j cypher保留path强加的顺序,以便稍后在查询中使用,neo4j,cypher,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]>关系的方向产生。 但是第三行中带有的扰乱了顺序。问题是,我需要的是1。过滤:相关的节点和2。仅获取不同的此类节点 有没有办法保持秩序?可能会

我使用的查询如下

MATCH p=((:Start)-[:NEXT*..100]->(n))
WHERE ALL(node IN nodes(p) WHERE ...)
WITH DISTINCT n WHERE (n:RELEVANT)
...
RETURN n.someprop;
其中,我想让结果按照自然顺序进行排序,自然顺序由
-[:NEXT]>
关系的方向产生。 但是第三行中带有的
扰乱了顺序。问题是,我需要的是1。过滤
:相关的
节点和2。仅获取不同的此类节点


有没有办法保持秩序?可能会在路径上指定编号顺序,并在以后使用
orderby
重新使用它?不知道怎么做。

如果您将
WHERE
子句从
WITH
中删除,并将标签
:RELEVANT
放在
匹配中
?可能是
中的
导致了问题。。。试试这个:

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

您要求的是不同的节点,这表明该节点可能可以通过多条路径访问,因此可能存在于距起始节点多个距离的位置

对于每个
n
的路径长度,应使用
min()
(或
max()
,具体取决于您的要求),而不是使用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;

这种方法的问题是:
:相关的
节点之间没有连接的路径。我还需要匹配非相关的节点,然后过滤相关的节点afterwards@tscherg我在
(:Start)
节点中放置了
:RELEVANT
,而不是
(n)
。我编辑了答案。现在明白了吗?这似乎是可能的!我总是觉得,当我把
:RELEVANT
标签那样放在
n
节点上时,我无法到达只有
:RELEVANT
节点没有路径的节点。我错了,这是可能的!谢谢@tscherg不客气!如果此答案解决了您的问题,请记住通知其他用户您的问题已解决,并帮助未来的观众了解您的问题。谢谢我仍然没有回答的问题是:如何获得不同的
:相关的
节点,并且与路径中的顺序相同?奇怪的是,您建议的查询完全恢复了顺序(即1,2,3中的3,2,1),谢谢!我必须像
max(length(filter)(节点中的mnode(p)WHERE(mnode:RELEVANT)))那样扩展它。
它完全符合我的要求!