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)))那样扩展它。
它完全符合我的要求!