我有一个数据集,它复制了git存储库中的提交历史记录。每个Commit
节点都有一个或多个父节点,它们也是Commit
个节点。提交具有commit_id
属性,并且引用了该提交中更改的文件。换句话说:
ChangedFile<-[:CHANGED_IN]-Commit
Commit-[:CONTAINS]->ChangedFile
Commit-[:CHILD_OF]->Commit
我现在正在尝试编写一个返回提交/文件对的Cypher查询,其中每个提交都包含对文件的最新更改。由于图形被设计为模仿具有父/子关系的git历史,因此查询应该支持选择从头开始的提交,即HEAD。
这是我到目前为止所得到的:
MATCH
(commit:Commit {commit_id: '460665895c91b2f9018e361b393d7e00dc86b418'}),
(file:ChangedFile)<-[:CHANGED_IN]-commit-[:CHILD_OF*]->(parent:Commit)
RETURN
file.path, parent.commit_id
不幸的是,此查询返回在[:CHILD_OF*]
关系中任意数量级别匹配的所有提交。我想让它停在每个文件的第一场比赛。就目前而言,我最终在结果集中看到了一堆重复的文件路径。
如何判断Neo4j / Cypher在每个文件的第一场比赛中停止,无论深度如何?我尝试添加UNIQUE
和其他一些东西,但我似乎找不到有用的东西。提前谢谢!
答案 0 :(得分:1)
也许我误解了您的数据模型以及您所追求的内容,但为什么要查找从提交到其父级的可变长度路径? Aren你只是在寻找父母吗?
MATCH
(commit:Commit {commit_id: '460665895c91b2f9018e361b393d7e00dc86b418'}),
(file:ChangedFile)<-[:CHANGED_IN]-commit-[:CHILD_OF]->(parent:Commit)
RETURN
file.path, parent.commit_id