2017-05-23 63 views
1

我在neo4j中有一個樹狀結構,我想找到具有指向祖先路徑的特定標籤的第一個節點,在該路徑中沒有相同類型的節點。Neo4j得到的節點在它的祖先路徑中沒有另一個類似標記的節點

例如:

/(:Y) <- (a:X) 
A <- (:Y) <- (c:X) <- (:Y) <- (d:X) <- (e:X) 
    \ (b:X)<- (f:X) 
    \ (g:X) 

在這種情況下的「A」是祖先,我想要的節點A,B,C,G,因爲它們具有在標籤「X」,而不是從分離祖先通過與標籤「X」

另一個節點我開始與該查詢:

match (c :X)-[:X*1]->(A) return c 

但它只返回並[b,G]和未並[c,G]因爲有之間的其它標記的節點祖先和'X'標記n Odes

回答

1

首先,得到你的祖先節點(我假裝它會在這種情況下有一個:祖先標籤,你可能想調整查詢以反映真實情況)。

MATCH (a:Ancestor),然後得到與所有連接的節點:X長達2級深標籤:MATCH (a)<-[*0..2]-(n:X),並確保這些n個節點尚未之間連接到其他X:WHERE NOT (n)-->(:X)並返回:RETURN n

因此,整個密碼查詢將如下所示: MATCH (a:Ancestor) MATCH (a)<-[*0..2]-(n:X) WHERE NOT (n)-->(:X) RETURN n

2

你會想爲此APOC Procedures,有一些配置選項的path expander procedures正是你想要的。

您需要使用終止符運算符/來使用labelFilter,這意味着路徑擴展將停止在給定標籤的第一個節點上,並且只會返回這些標籤的節點。

喜歡的東西:

... 
// assume you've already matched to ancester 'a' 
CALL apoc.path.subgraphNodes(a, {labelFilter:'/X'}) YIELD node 
RETURN node 

應該返回第一:從起始節點沿每條路徑X節點。

相關問題