如何修改Neo4j查询以获取节点的1-3度反向邻居?
解决Neo4j反向多阶邻居查询的问题
你的问题根源在于连续使用MATCH会强制要求所有匹配路径必须存在,所以当某个节点没有3度反向邻居时,整个匹配链会被过滤掉,导致低阶邻居也无法返回。要解决这个问题,需要用OPTIONAL MATCH来处理非必须的高阶邻居匹配。
修改后的查询语句
MATCH (changedNode: Function) WHERE changedNode.signature IN [...] // 1度反向邻居为基础匹配(若需允许无1度邻居的节点也返回,此处可改为OPTIONAL MATCH) MATCH (neig1: Function)-[:CALLS]->(changedNode) // 2度邻居为可选匹配,不存在则neig2返回null OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1) // 3度邻居为可选匹配,不存在则neig3返回null OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2) RETURN DISTINCT neig1.functionName AS 1度反向邻居, neig2.functionName AS 2度反向邻居, neig3.functionName AS 3度反向邻居
关键说明
MATCH用于必须存在的路径匹配,确保能拿到1度反向邻居;如果需要包含没有任何反向邻居的目标节点,把第一个MATCH也改为OPTIONAL MATCH即可OPTIONAL MATCH会尝试匹配路径,找不到对应节点时返回null,不会过滤已有匹配的结果- 通过
AS给返回字段命名,让结果可读性更强
示例结果(对应图结构A -> B -> C -> D -> E,查询C节点时)
| 1度反向邻居 | 2度反向邻居 | 3度反向邻居 |
|---|---|---|
| B | A | null |
这样就能正确返回所有存在的1、2、3度反向邻居,即使高阶邻居不存在也不会影响低阶结果的展示。
内容的提问来源于stack exchange,提问作者firemancer
相关产品推荐
相关产品推荐

