2013-10-05 82 views
2

我爲自己設置了一個簡單的例子,以瞭解Neo4j如何處理涉及與自己有關係的節點的查詢,並且我無法讓Cypher爲我提供所有路徑。Cypher查詢不返回所有預期路徑

這裏是我的數據:

CREATE (A {name:'A'}), (B {name:'B'}), (C {name:'C'}) 
CREATE 
    (A)-[:REL]->(A), 
    (A)-[:REL]->(B), 
    (A)-[:REL]->(C), 
    (B)-[:REL]->(A), 
    (B)-[:REL]->(B), 
    (B)-[:REL]->(C), 
    (C)-[:REL]->(A), 
    (C)-[:REL]->(B), 
    (C)-[:REL]->(C) 

這裏是我在做查詢:

MATCH p = (x)-[:REL*1..3]->(y) 
WHERE x.name='A' AND y.name='B' AND LENGTH(p) = 3 
RETURN nodes(p) 

我的預期結果是:

A, A, A, B 
A, A, B, B 
A, A, C, B 
A, B, A, B 
A, B, B, B 
A, B, C, B 
A, C, A, B 
A, C, B, B 
A, C, C, B 

但我得到的是:

[(3 {name:"A"}), (2 {name:"B"}), (1 {name:"C"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (3 {name:"A"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (2 {name:"B"}), (2 {name:"B"})] 
[(3 {name:"A"}), (1 {name:"C"}), (1 {name:"C"}), (2 {name:"B"})] 
[(3 {name:"A"}), (3 {name:"A"}), (2 {name:"B"}), (2 {name:"B"})] 
[(3 {name:"A"}), (3 {name:"A"}), (1 {name:"C"}), (2 {name:"B"})] 

所以我沒有得到的途徑是:

A, A, A, B 
A, B, B, B 
A, B, A, B 

有沒有人有一些見解?

這是在控制檯:http://console.neo4j.org/?id=4srv4h

在此先感謝。

回答

1

從A到A只有一個鏈接,所以它只能從A到A一次。這就是爲什麼你沒有得到A,A,A(或B,B,B)......

同樣,你在第一次進入他們之間時消耗了A→B的關係,所以你不能得到A,B,A,B。

最後,你可以做:REL*3,並離開length(p) = 3

+0

哦,這是有道理的。謝謝Wes。你知道任何技巧來獲得我想要的結果嗎?我試圖建模一個可以進入以前的狀態(節點)的隨機過程,所以我希望我的查詢可以在遍歷中重複關係。 如果不是,那麼我想我不得不重新考慮這個想法。 :) –

+0

你知道這條路是多長時間嗎?你可以用WITH分解它。行爲是這樣的原因是爲了防止有循環的無限路徑。 Rels只能被遍歷一次。 –

+0

http://console.neo4j.org/r/sl0z99 –