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

问题描述 投票:0回答:5

在此密码查询中,将返回与 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

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

neo4j cypher path-finding
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

3
投票

由于路径是一个集合,您可以应用

LAST
函数。


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 界面中运行这个查询会带来所有最后的节点。从 py2neu 运行相同的查询不会。 从 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
© www.soinside.com 2019 - 2024. All rights reserved.