查询以显示 Neo4j 中的二级(间接)关系

st1*_*led 3 neo4j cypher

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

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

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

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

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

这个查询看起来很好,但是它只是报告了一堆没有任何关系的人物和书籍,因为书籍和人物之间没有直接关系。neo4j 能否推断出这些间接关系并将它们显示在查询中,而无需我修改数据并为每个模式手动插入

(book)-[:CONTAINS]->(chapter)-[:MENTIONS]->(character)
Run Code Online (Sandbox Code Playgroud)

新的关系

(book)-[:TALKS_ABOUT]->(character)
Run Code Online (Sandbox Code Playgroud)

?

std*_*b-- 5

看起来你需要虚拟关系。你可以试试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
Run Code Online (Sandbox Code Playgroud)