【问题标题】:Neo4j: How do you find the first (shallowest) match for all relationship matches?Neo4j:你如何找到所有关系匹配的第一个(最浅)匹配?
【发布时间】: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 和其他一些东西,但我似乎找不到有用的东西。提前致谢!

【问题讨论】:

  • 旁注:CONTAINSCHANGED_IN 似乎是相同的(除了任何可能的属性)。您应该考虑只使用其中之一。
  • 哦,那是真的。我是图形数据库的 n00b,感谢您的提示 :)

标签: database graph neo4j cypher graph-databases


【解决方案1】:

也许我误解了您的数据模型和您的目标,但您为什么要寻找从提交到其父级的可变长度路径?你不是在找家长吗?

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

【讨论】:

  • 不一定。我正在寻找包含对文件的最新更改的提交,这可能是任意数量的父母跳跃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多