給定圖(或子),在這種情況下根新...的Neo4j - 算最節點
如何獲得它們從根本上最遠的深度節點(即不直接連接到的節點更大的深度),它們具有特定的屬性。
例如...當我對其他綠色(不是最外層)(或最外層)或橙色(在它們的分支上最遠)感興趣時,如何獲得綠色的「Get Me」不是綠色)。我不從關心深度....
感謝您的幫助
克里斯
給定圖(或子),在這種情況下根新...的Neo4j - 算最節點
如何獲得它們從根本上最遠的深度節點(即不直接連接到的節點更大的深度),它們具有特定的屬性。
例如...當我對其他綠色(不是最外層)(或最外層)或橙色(在它們的分支上最遠)感興趣時,如何獲得綠色的「Get Me」不是綠色)。我不從關心深度....
感謝您的幫助
克里斯
到弗蘭克斯另一種方法是找到所有的葉子節點第一個符合條件的,然後利用這些節點,篩選到那些具有路徑新節點
// 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;
我會解決所在的路徑應當只包含綠色節點的情況下(除也許),因爲否則計算起來可能會非常昂貴,因爲您需要查找是否還有另一個綠色節點。
注意:在我的示例中,可變長度路徑是無界的,您可能需要添加一個上限以避免真正緩慢的查詢。
假設屬性是一個標籤,和關係可以在任何方向進行遍歷,您可以使用下面的查詢:
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))
(: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))
你只遍歷一個方向的關係。
MATCH p = (:Blue)-[*]->(g:Green)
WHERE all(n IN tail(nodes(p)) WHERE n:Green)
AND NOT (g)-->(:Green)
RETURN last(nodes(p))
應該該路徑只包含綠色節點?這些關係可以在任何方向嗎?特定屬性是標籤還是屬性? –