我試圖獲得兩個節點之間的所有中間節點,以便在給定某種類型的關係時,只返回相互連接的節點。在neo4j中,通過相互連接過濾某些關係
下面是一些示例數據來幫助我解釋我的問題:Neo4j console。
我正在尋找P1和P3之間相互連接的節點。對於像「學習」這樣的關係,我可以使用單向邊緣。但是,對於「連接」關係,我希望能夠過濾掉沒有雙向邊緣的節點。因此,查詢應該只返回S1和P5。
如何過濾我的查詢,使P2和P4不顯示(因爲它們之間沒有雙向邊緣,P1和P3)?
我試圖獲得兩個節點之間的所有中間節點,以便在給定某種類型的關係時,只返回相互連接的節點。在neo4j中,通過相互連接過濾某些關係
下面是一些示例數據來幫助我解釋我的問題:Neo4j console。
我正在尋找P1和P3之間相互連接的節點。對於像「學習」這樣的關係,我可以使用單向邊緣。但是,對於「連接」關係,我希望能夠過濾掉沒有雙向邊緣的節點。因此,查詢應該只返回S1和P5。
如何過濾我的查詢,使P2和P4不顯示(因爲它們之間沒有雙向邊緣,P1和P3)?
一個想法是考慮中間節點出現的路徑數。如果計數等於1,那麼它的結果的一部分
MATCH (a:Person { name: 'p1' })-[r1]-(b)-[r2]-(c:Person { name: 'p3' })
WITH b, count(*) AS count
WHERE count=1
RETURN b
你怎麼是這樣的:
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