如何在Neo4j中获取路径中的最后一个节点?

11

在这个密码查询中,将返回具有STATUS="on"属性关系的节点之间的最长路径/路径,但我还想获取路径/路径的最后一个节点。

查询:

START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
  WHERE length(path)= maxLength) AS longestPaths

我该如何将它添加到查询中?谢谢。

5个回答

8
这将生成两个数组。第一个数组是每条路径中的最后一项,第二个是每条路径:
START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
WITH FILTER(path IN paths WHERE length(path)= maxLength) AS longestPaths
RETURN EXTRACT(path IN longestPaths | LAST(path)) as last, longestPaths

@LameCoder 有没有办法获取最后一个节点,而不是路径?我得到的是一些 JSON 集合,而不是节点? - Aman Gupta
2
要将此内容翻译为Neo4j 2.x,请将LAST(path)更改为LAST(nodes(path)),如下所示的2.x注释。无论如何,这对我有效。 - Andrew Lank

3

既然路径是一个集合,你可以应用LAST函数。


从neo4j 2.0开始,路径不再是一个集合,因此您不能直接在其上运行LAST。 - Tristan Reid
6
你可以使用 last(nodes(mypath))。它的意思是获取路径 mypath 中的最后一个节点。 - Stefan Armbruster

1
这个示例是用于获取与next_action关系相连的每个节点分支的最后一个节点。
MATCH p=(a:acct)-[:next_action*]->(c)
WITH COLLECT({node:c, l:length(p)}) AS paths, MAX(length(p)) AS maxLength, a.uid as uid
WITH [x IN paths WHERE x.l= maxLength] AS last_node
RETURN last_node

在Neo4j GUI界面中运行此查询会显示所有最后的节点,但从py2neo运行相同的查询则不会。在py2neo中运行时,以下修改将起作用:

MATCH p=(a:acct)-[:next_action*]->(c)
WITH COLLECT({node:c, l:length(p)}) AS paths, MAX(length(p)) AS maxLength, a.uid as uid
WITH [x IN paths WHERE x.l= maxLength] AS last_node
WITH COLLECT(last_node) as last_nodes
RETURN last_nodes

0
从Neo4J 4.X开始,FILTER()不再受支持,因此可以用REDUCE()替换。 以下是替换的方式:
START n=node(*)
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
  WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
// WITH FILTER(path IN paths WHERE length(path)= maxLength) AS longestPaths
WITH REDUCE( newPaths = [], path in paths |
            CASE
            WHEN length(path)= maxLength THEN newPaths + [path]
            END ) AS longestPaths
RETURN EXTRACT(path IN longestPaths | LAST(path)) as last, longestPaths

0

对于任何想要获取路径中最后一个节点的人:

如果最后一个节点具有相同的类型:

MATCH (c:Tweet{ id: 1 })-[:REPLY_TO*]->(target)
RETURN last(collect(target))

如果最后一个节点类型不同:
MATCH (c:Comment{ id: 1 })-[:COMMENT_TO*]->(post:HeychainPost)
RETURN post

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接