【问题标题】:Query to show second degree (indirect) relationships in Neo4j在 Neo4j 中显示二级(间接)关系的查询
【发布时间】:2017-02-22 12:57:17
【问题描述】:

我有一个包含书籍、章节和角色的图表。书籍包含章节,章节提及人物。我想写一个查询,显示出现在大多数书中的 10 个字符,以及它们出现在的书中。

假设我的问题稍微简单一点,我可以轻松编写一个查询,显示出现在大多数章节中的 10 个字符:

MATCH (chapter)-[:MENTIONS]->(character)
RETURN character,
COLLECT(chapter) as chapters
ORDER BY SIZE(chapters) DESC
LIMIT 10

上面的这个查询运行良好。现在我正在尝试编写一个类似的查询来显示书籍而不是章节:

MATCH (book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character)
RETURN character,
COLLECT(book) as books
ORDER BY SIZE(books) DESC
LIMIT 10

这个查询似乎工作正常,但它只是报告了一堆没有任何关系的人物和书籍,因为书籍和人物之间没有直接关系。 Neo4j 可以推断出这些间接关系并在查询中显示它们,而无需我修改数据并为每个模式手动插入

(book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character)

新的关系

(book)-[:TALKS_ABOUT]->(character)

?

【问题讨论】:

  • 查询结果需要什么样的关系?
  • 我有点困惑...您的查询结果应该显示一个字符以及他们出现的书籍集合,按出现的书籍数量排序(尽管您可能需要COLLECT(DISTINCT book) as books 来删除您收藏中的重复项)。你说它报道的人物和书籍没有任何关系,但显然存在间接关系,正如你的匹配所证明的那样。结果中的哪些内容不适合您?
  • @stdob:我需要一种模型中没有的关系类型,并且我想避免手动添加,就像我在上一段的示例中所说的那样。这种关系应该显示人物和书籍之间的联系。
  • @InverseFalcon:我希望结果显示检索到的字符与它们出现的书籍之间的关系。目前,我看到的只是 10 个字符节点加上一些书籍节点,但我无法从单个字符追溯到它出现的书籍,除非我双击字符节点并将其展开以也显示章节。跨度>
  • 啊,您对图形结果视图感兴趣,而不是返回的实际行数据。 APOC 的虚拟关系是这里的必经之路,stdob-- 有一个很好的使用示例。

标签: neo4j cypher


【解决方案1】:

看起来您需要虚拟关系。你可以试试apoc.create.vRelationship

MATCH (book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character)
WITH character, 
     COLLECT(distinct book) as books 
     ORDER BY SIZE(books) DESC LIMIT 10
UNWIND books as book
CALL apoc.create.vRelationship(book,'TALKS_ABOUT',{}, character) yield rel
RETURN character, collect(rel) as rels

【讨论】:

  • 正是我想要的!我不知道这个 Neo4j 插件。
  • @st1led 强烈推荐学习这个库:很多cypher解决不了的问题apoc可以解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 1970-01-01
相关资源
最近更新 更多