【发布时间】:2016-02-16 16:58:37
【问题描述】:
我有一个在 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 和其他一些东西,但我似乎找不到有用的东西。提前致谢!
【问题讨论】:
-
旁注:
CONTAINS和CHANGED_IN似乎是相同的(除了任何可能的属性)。您应该考虑只使用其中之一。 -
哦,那是真的。我是图形数据库的 n00b,感谢您的提示 :)
标签: database graph neo4j cypher graph-databases