2014-03-07 48 views
1

我試圖獲得兩個節點之間的所有中間節點,以便在給定某種類型的關係時,只返回相互連接的節點。在neo4j中,通過相互連接過濾某些關係

下面是一些示例數據來幫助我解釋我的問題:Neo4j console

我正在尋找P1和P3之間相互連接的節點。對於像「學習」這樣的關係,我可以使用單向邊緣。但是,對於「連接」關係,我希望能夠過濾掉沒有雙向邊緣的節點。因此,查詢應該只返回S1和P5。

如何過濾我的查詢,使P2和P4不顯示(因爲它們之間沒有雙向邊緣,P1和P3)?

回答

1

一個想法是考慮中間節點出現的路徑數。如果計數等於1,那麼它的結果的一部分

MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' }) 
WITH b, count(*) AS count 
WHERE count=1 
RETURN b 
1

你怎麼是這樣的:

MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' }) 
WITH a,c,b,type(r1) AS rel_type1,collect(r1) AS rels1, collect(r2) AS rels2, type(r2) AS rel_type2 
WHERE (length(rels1)=1 OR startNode(rels1[0])=endNode(rels1[0])) AND (length(rels2)=1 OR startNode(rels2[0])=endNode(rels2[1])) 
RETURN * 

結果:

+--------------------------------------------------------------------------------------------------------------------------------+ 
| rels2    | rel_type1 | a     | b     | c     | rels1    | rel_type2 | 
+--------------------------------------------------------------------------------------------------------------------------------+ 
| [:studies[10] {}] | "studies" | Node[0]{name:"p1"} | Node[5]{name:"s1"} | Node[2]{name:"p3"} | [:studies[9] {}] | "studies" | 
| [:connects[8] {}] | "connects" | Node[0]{name:"p1"} | Node[1]{name:"p2"} | Node[2]{name:"p3"} | [:connects[0] {}] | "connects" | 
+--------------------------------------------------------------------------------------------------------------------------------+ 
2 rows 
35 ms 

這裏是控制檯:http://console.neo4j.org/r/8m9u78