2014-03-03 46 views
0

我有一個以循環方式建模像這樣的鏈接列表時終止條件直到我到達列表的結尾/開始。 (用戶節點)Neo4j的Cypher支架使用可變水平路徑

當我運行以下查詢:

MATCH (u:USER) 
WITH u 
MATCH (nl:NODELINK)-[:LINK*]->(m) 
WHERE nl.linkId = 'bb' AND m <> u 
RETURN m 

它返回我下面的節點

(3:NODELINK {linkId:'cc'}) 
(4:NODELINK {linkId:'dd'}) 
(1:NODELINK {linkId:'aa'}) 
(2:NODELINK {linkId:'bb'}) 

正如你可以看到我的查詢環繞,並開始從返回節點名單的開始。我想在用戶節點終止,只有列表中的

(3:NODELINK {linkId:'cc'}) 
(4:NODELINK {linkId:'dd'}) 

我創建了一個圖表結束之前返回的節點是demonstrates the issue here

如何查詢,以便在節點鏈接開始感興趣並在所有節點到達用戶節點之前返回?

回答

0

WHERE條款限制了路徑中的第一和最後一個節點,而不是中間的,所以是的,查詢可以匹配的路徑,其中包括用戶節點。

而不是匹配很多路徑,只返回末端節點,嘗試匹配從'cc'節點到用戶節點的一條路徑,並返回該路徑中的所有節點(除了最後一個,如果你不想要用戶節點)。

MATCH path=(nl:NODELINK {linkId:'cc'})-[:LINK*]->(u:USER) 
RETURN nodes(path) 

RETURN nodes(path)[..-1] 
如果您想返回所有節點除了最後一個

+0

就是這樣。有趣的是,我並不知道你可以通過在路徑中指定linkId來進行匹配(不使用WHERE linkId ='cc') –

+0

我有關於解包路徑以允許進一步匹配的問題,http:// stackoverflow.com/questions/22184924/neo4j-cypher-how-do-you-unpack-nodes-from-a-path-to-allow-for-further-matching –

0

請嘗試以下查詢。我認爲你應該把NODELINK從第一個MATCH子句開始遍歷的地方帶上,因爲它會把你的圖表指向哪裏開始,而不是匹配USER標籤上的user節點。

MATCH (nl:NODELINK) 
WHERE nl.linkId = 'aa' 
WITH nl 
MATCH p=(nl)-[:LINK*1..]->(m:USER) 
RETURN filter(t IN nodes(p) 
       WHERE t <> nl) AS nodes 
相關問題