2016-09-27 228 views
0

給定圖(或子),在這種情況下根新...的Neo4j - 算最節點

如何獲得它們從根本上最遠的深度節點(即不直接連接到的節點更大的深度),它們具有特定的屬性。

例如...當我對其他綠色(不是最外層)(或最外層)或橙色(在它們的分支上最遠)感興趣時,如何獲得綠色的「Get Me」不是綠色)。我不從關心深度....

how do I get the green "Get Me" nodes

感謝您的幫助

克里斯

+0

應該該路徑只包含綠色節點?這些關係可以在任何方向嗎?特定屬性是標籤還是屬性? –

回答

2

到弗蘭克斯另一種方法是找到所有的葉子節點第一個符合條件的,然後利用這些節點,篩選到那些具有路徑新節點

// find all Green nodes (you can add in a filter/WHERE clause to 
// just match the ones with specific properties) 
MATCH (g:Green)--(o) 
// for each match, calculate the degree of the node (the number of 
// relationships - undirected in this example) 
WITH g, count(*) as deg 
// filter down the results to just the leaf nodes (deg 1) 
WHERE deg = 1 
WITH g 
// finally only return those that have a path to the Blue (neo) node 
MATCH (g)-[*]-(b:Blue) 
// just return the green nodes 
RETURN g; 
2

我會解決所在的路徑應當只包含綠色節點的情況下(除也許),因爲否則計算起來可能會非常昂貴,因爲您需要查找是否還有另一個綠色節點。

注意:在我的示例中,可變長度路徑是無界的,您可能需要添加一個上限以避免真正緩慢的查詢。

選項1

假設屬性是一個標籤,和關係可以在任何方向進行遍歷,您可以使用下面的查詢:

MATCH p = (:Blue)-[*]-(g:Green) 
WHERE all(n IN tail(nodes(p)) WHERE n:Green) 
OPTIONAL MATCH (g)--(g2:Green) 
WITH p, collect(g2) AS greens 
WHERE size(greens) <= 1 
RETURN last(nodes(p)) 
  1. 它發現路徑,只有包括綠色節點,除了可以是任何東西的開始節點。
  2. 然後它收集連接到路徑最後一個節點的所有其他綠色節點。當路徑簡單地爲(:Blue)--(g:Green)或者只有一個,當路徑類似於(:Blue)--(:Green)--(g:Green)(即路徑的倒數第二個節點)時,應該不存在這樣的節點。如果連接了另一個綠色節點,則該路徑不會在最外面的節點處結束。

它的工作原理幾乎相同,如果屬性是一個屬性:

MATCH p = (:Blue)-[*]-(g) 
WHERE all(n IN tail(nodes(p)) WHERE n.prop = {value}) 
OPTIONAL MATCH (g)--(g2) 
WHERE g2.prop = {value} 
WITH p, collect(g2) AS greens 
WHERE size(greens) <= 1 
RETURN last(nodes(p)) 

選項2

你只遍歷一個方向的關係。

MATCH p = (:Blue)-[*]->(g:Green) 
WHERE all(n IN tail(nodes(p)) WHERE n:Green) 
AND NOT (g)-->(:Green) 
RETURN last(nodes(p))