2017-02-22 13 views
2

書籍、チャプター、および文字を含むグラフがあります。書籍には章が含まれ、章には文字が含まれています。ほとんどの書籍に表示される10文字とその中に登場する書籍を表示するクエリを書いてみたいと思います。Neo4jで2次(間接)関係を表示するクエリ

私の問題は少しシンプルであるとすれば、私は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 

このクエリは正常に動作するようだが、何の直接のがないので、それだけで、任意の関係なしに文字や書籍の束を報告します本と文字の関係。これらの間接的な関係を推測し、私はデータを変更し、手動で各パターン

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

新たな関係

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

のために挿入することなく、クエリでそれらを表示のNeo4jはできますか?

+0

クエリの結果としてどのような関係が必要ですか? –

+0

私はちょっと混乱しています...あなたの質問の結果は、キャラクターと登場した本のコレクションを、彼らが登場した本の数によって順番に表示されるべきです(しかし、あなたは 'COLLECT(DISTINCT book )あなたのコレクションの重複を取り除くために書籍として)。あなたは関係なく、文字と本を報告していると言いますが、あなたの試合で証明されているように間接的な関係があります。結果はあなたのために働いていないのですか? – InverseFalcon

+0

@stdob:モデルにない種類の関係が必要です。最後の段落の例で説明したように手動で追加することは避けたいと考えています。関係は、文字と本の間のリンクを示すはずです。 – st1led

答えて

4

仮想関係が必要なようです。お試しください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 
+0

まさに私が探していたもの!私はこのNeo4jプラグインについて知らなかった。 – st1led

+0

@ st1ledこのライブラリを勉強することを強く推奨します: 'cypher 'で解決できない多くの問題は' apoc'で解決できます。 –

関連する問題