【问题标题】:Neo4j query for getting multiple connected nodes用于获取多个连接节点的 Neo4j 查询
【发布时间】:2023-02-15 13:28:12
【问题描述】:
在我的图中,我想获得某个节点的一级、二级和三级邻居。如果我的图表是A -> B -> C -> D -> E,那么
- C的一级邻居是B
- C的二级邻居是A
- C 的三级邻居为无
检查邻居时,我沿边缘的相反方向前进。为了获取这些节点,我编写了以下查询。
MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
MATCH (neig2: Function)-[:CALLS]->(neig1)
MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName, neig3.functionName
我意识到这段代码不会将 B 作为 C 的一级邻居返回,因为 A 没有任何邻居(neig3 为空)。换句话说,这个查询需要一个节点有一个三度邻居。我明白这一点,但无法更新我的代码。我应该如何修改我的查询?
【问题讨论】:
标签:
neo4j
cypher
memgraphdb
opencypher
【解决方案1】:
您可以使用可选匹配,因为 A 可能没有邻居。然后查询将为 neigh3 返回空值。
MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1)
OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName, neig3.functionName
【解决方案2】:
用于可选匹配将模式与图形数据库进行匹配,就像 MATCH 一样。不同之处在于,如果未找到匹配项,则 OPTIONAL MATCH 将对模式的缺失部分使用 null。 OPTIONAL MATCH 可以被认为是 SQL 中外连接的 Cypher 等价物。
MATCH (changedNode: Function) WHERE changedNode.signature IN [...]
MATCH (neig1: Function)-[:CALLS]->(changedNode)
OPTIONAL MATCH (neig2: Function)-[:CALLS]->(neig1)
OPTIONAL MATCH (neig3: Function)-[:CALLS]->(neig2)
RETURN DISTINCT neig1.functionName, neig2.functionName, neig3.functionName
更多解释请访问:https://neo4j.com/developer/kb/a-note-on-optional-matches/