2014-09-03 103 views
3

我有一個圖表,當前有幾千個節點,每個節點有兩到十個關係。如果我們看一下在單個節點及其連接,它們看起來像有些這樣的: Node and relating nodes限制每個標籤的節點

與字母字符的節點是分類節點。所有其他節點都是與這些類別節點具有associated with關係的內容節點,並且它們的顏色表示將哪些標籤附加到它。爲簡單起見,每個節點都有一個標籤,每個節點只連接到單個其他節點:

  • 藍:分類
  • 綠色:科學出版社
  • 橙色:一般條款
  • 紫色:博客文章

現在,我試圖做的最簡單的事情是獲取一定數量的相關內容節點到給定節點。下面收益全部二十相關節點:

START n = node(1) 
MATCH (n)-->(category)<--(m) 
RETURN m 

不過,我想每個類別此過濾每個標籤可以2個節點(事後由具有多個類別與起始節點重疊的節點與排序播放

目前,我從上面的查詢手動得到結果,然後在結果循環這樣做,但這種感覺就像多餘的工作給我。

有沒有辦法通過的Neo4j的密碼查詢語言要做到這一點?

回答

3

這個答案延伸@斯特凡的原始答案,返回所有類別的結果,而不僅僅是其中的一個。

START p = node(1) 
MATCH (p)-->(category)<--(m) 
WITH category, labels(m) as label, collect(m)[0..2] as nodes 
UNWIND label as lbl 
UNWIND nodes AS n 
RETURN category, lbl, n 

爲了便於手動驗證結果,還可以將此行添加到最後以對結果進行排序。 (此排序可能不應該是你的最終代碼,除非你真的需要排序結果,並願意花費額外的計算時間):

ORDER BY id(category), lbl 
+0

謝謝,這確實是我正在尋找的。 – Aeveus 2014-09-09 14:23:25

3

Cypher有一個labels函數返回給定節點的所有標籤的數組。假設你只有每m節點只有一個標籤下面的辦法可以工作:

START n = node(1) 
MATCH (n)-->(category)<--(m) 
WITH labels(m)[0] as label, collect[m][0..2] as nodes 
UNWIND nodes as n 
RETURN n 

WITH陳述建立起共享相同標籤的所有節點的單獨的集合。使用下標運算符[0..2]集合只保留前兩個元素。 Unwind然後將集合轉換爲結果的單獨行。從這裏開始,您可以申請訂購。

+0

不知該停在遇到的第一類節點。在上面的圖表上運行這個返回4個節點(即2,3,4和6),如果我只有一個類別,這確實是我想要的,然而,在這種情況下,我正在尋找除4之外的所有數值節點其中:16.「collect」方法是否被覆蓋? – Aeveus 2014-09-03 13:37:33

+0

哦,我看到,「collect」會創建2個組,每個標籤之一(因此分別具有8和12)。做類似'collect(m)[0..8]'的操作會返回16個節點,每個標籤返回正確的金額,但是每個類別的每個標籤不會返回2個。 – Aeveus 2014-09-03 13:44:58