我正在使用 Neo4j 数据库,并尝试创建从firstAffected到fixedVersion的Issue节点和Version节点之间的影响关系。然而,从结果来看,并不是所有的关系都被创建了。
这是我的询问:
MATCH (issue:Issue {name: "Issue 1"})
MATCH (firstAffected:Version)<-[:First_Affected]-(issue), (fixedVersion:Version)<-[:Fixed]-(issue)
WITH fixedVersion, firstAffected, issue
MATCH path = (firstAffected)<-[:NEXT_VERSION*]-(fixedVersion)
WITH nodes(path) AS allNodes, issue
WITH allNodes[..-1] AS impact_target_nodes, issue
UNWIND impact_target_nodes AS targetNode
CREATE (issue)-[:Impact]->(targetNode)
该查询不会将影响关系添加到版本7。我期望路径中的所有版本都会链接到该问题,但事实并非如此。
如何修改查询以正确为firstAffected 和fixedVersion 之间的所有版本创建影响关系?
您似乎正在尝试将问题与每个版本(第一个受影响的版本或每个没有修复的下游版本)之间的关系添加起来。一个很好的方法是使用带有内联谓词的量化路径模式:
MATCH (issue:Issue {name: "Issue 1"})-[:First_Affected]->(firstAffected:Version)
(()<-[:NEXT_VERSION]-(r:Version) WHERE NOT EXISTS { (r)<-[:Fixed]-(issue) } )*
(impactedVersion:Version)
WITH DISTINCT issue, impactedVersion
CREATE (issue)-[:Impact]->(impactedVersion)
这将尽可能地遍历,直到遇到死胡同(如版本 7)或在遇到修复版本之前(如版本 2)。它使用谓词
NOT EXISTS { (r)<-[:Fixed]-(issue) }
在版本 3 之前停止,这是引入修复的地方。