Neo4j:你怎么找到所有关系比赛的第一个(最浅的)比赛?

时间:2016-02-16 16:58:38

标签: database graph neo4j cypher graph-databases

我有一个数据集,它复制了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和其他一些东西,但我似乎找不到有用的东西。提前谢谢!

1 个答案:

答案 0 :(得分:1)

也许我误解了您的数据模型以及您所追求的内容,但为什么要查找从提交到其父级的可变长度路径? Aren你只是在寻找父母吗?

MATCH
  (commit:Commit {commit_id: '460665895c91b2f9018e361b393d7e00dc86b418'}),
  (file:ChangedFile)<-[:CHANGED_IN]-commit-[:CHILD_OF]->(parent:Commit)
RETURN
  file.path, parent.commit_id