2017-02-22 40 views
2

我有一本關於書籍,章節和字符的圖表。書籍包含章節,章節提及字符。我想寫一個查詢,向我顯示出現在大多數書籍中的10個字符以及它們出現的書籍。查詢以顯示Neo4j中的二級(間接)關係

假設我的問題稍微簡單一些,我可以輕鬆地編寫一個查詢,向我顯示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) 

+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強烈建議學習這個庫:使用'app'解決許多無法用'cypher'解決的問題。 –