2017-02-14 1019 views
3

我正在使用Neo4j CE 3.1.1,並且我與作者和書籍之間存在關係WRITES。我想找到作者數量最多的N(例如N = 10)書籍。下面的一些例子,我發現,我想出了查詢:Neo4j:查詢找到具有最多關係的節點及其連接的節點

MATCH (a)-[r:WRITES]->(b) 
RETURN r, 
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10 

當我在Neo4j的瀏覽器中執行此查詢,我得到了10本書,但這些並不像大多數作者所寫的那些,因爲它們顯示只有幾個WRITES與作者的關係。如果我更改查詢到

MATCH (a)-[r:WRITES]->(b) 
RETURN b, 
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10 

然後我得到了10本書最作家,但我沒有看到他們的作者的關係。要做到這一點,我必須寫額外的查詢中顯式聲明書我在前面的查詢中找到的名稱:

MATCH()-[r:WRITES]->(b) 
WHERE b.title="Title of a book with many authors" 
RETURN r 

我在做什麼錯?爲什麼不是第一個查詢按預期工作?

回答

3

聚合只有基於非聚集列背景,並與你的對手,一個獨特的關係將只在搜索結果中出現一次。

所以,你的第一個查詢請求行上的每個關係,以及特定關係的數量,這是1

你可能會在幾個不同的方式重寫這個。

之一是收集作者和訂單上的作者列表的大小:

MATCH (a)-[:WRITES]->(b) 
RETURN b, COLLECT(a) as authors 
ORDER BY SIZE(authors) DESC LIMIT 10 

您可以隨時收集作者及其關係,如果關係本身有趣的是你。

編輯

如果你碰巧有您的節點上的標籤(你絕對應該有你的節點上的標籤),你可以通過匹配到所有書籍,漸漸傳入的大小嚐試不同的方法:寫關係每本書,訂購和限制上,然後進行匹配作者:

MATCH (b:Book) 
WITH b, SIZE(()-[:WRITES]->(b)) as authorCnt 
ORDER BY authorCnt DESC LIMIT 10 
MATCH (a)-[:WRITES]->(b) 
RETURN b, a 

您可以收集關於作者和/或返回的關係爲好,這取決於你的輸出需要。

+0

非常感謝! – st1led

+0

當然可以!雖然你可能想要首先分析查詢,但我給出的第一個可能不會像表格一樣,因爲它會在大圖上進行大量的收集。 – InverseFalcon

0

你很接近:排序後,有必要重新發現作者。例如:

MATCH (a:Author)-[r:WRITES]->(b:Book) 
WITH b, 
    COUNT(r) AS authorsCount 
    ORDER BY authorsCount DESC LIMIT 10 
MATCH (b)<-[:WRITES]-(a:Author) 
RETURN b, 
     COLLECT(a) AS authors 
     ORDER BY size(authors) DESC 
+0

我試過這個查詢,它也可以。我沒有大數據,但不知何故,我覺得它比可接受的答案中的第一個可擴展性低(只有一個MATCH子句與2個比較)。但是,我不是neo4j內部工作/優化方面的專家,而且這也很好。 – st1led

+0

@ st1led您可以隨時對查詢進行PROFILE確認。也就是說,第二場比賽是在第10場比賽之後,所以它不像第一場比賽那麼重,所以表演實際上應該都是相似的。 – InverseFalcon

相關問題