簡體   English   中英

根據兩個不同節點之間的關系查詢節點

[英]Querying nodes based on relationships between two different nodes

我有一個圖表,其中有兩種不同類型的節點 A 和 B 通過關系 rel 連接。 它的存在使得 A 的多個節點可能連接到 B 之一。我的確切問題是,假設我有 2 個 A 類型的節點 a1、a2 通過關系 rel 連接到 b1。 我有與節點 b2 相關的類型 A 的節點 a3。 我想找到一個包含 a1、a2 和 a3 的節點 b3,然后在 b3 和 b2、b1 之間建立關系,如果它們滿足一個屬性(b3.prop/b2.prop>x & b3.prop/b1.prop>x )。 是否可以在 cypher 中編寫一個查詢來處理這樣的多個關系?

這可能適用於您的場景:

MATCH (b1:B), (b2:B)
WHERE b1.id = 123 AND b2.id = 456
MATCH (a1:A)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2
WITH b2, COLLECT(DISTINCT a1) AS a1s, COLLECT(DISTINCT y1) AS otherBs
WITH b2, [b IN otherBs WHERE ALL(a IN a1s WHERE (a)-[:rel]->(b))] AS candidates
WHERE SIZE(candidates) > 0
MATCH (a2:A)-[:rel]->(b2)
WITH candidates, COLLECT(a2) AS a2s
UNWIND [c IN candidates WHERE ALL(a IN a2s WHERE (a)-[:rel]->(c))] AS b3
RETURN b3

此查詢假定rel關系從A指向B ,並且僅當存在任何適當的b3節點時才會返回結果。 它首先創建與b1相關的A節點相關的所有可能B candidates的列表。 然后它會縮減candidates列表,只保留與b2相關的A節點的B節點。

此查詢中有許多細微差別。 例如,如果與b1rel關系的任何A節點與其他B節點(與b1b2不同)不具有rel關系,則此代碼段將中止查詢:

MATCH (a1)-[:rel]->(b1)
MATCH (a1)-[:rel]->(y1:B)
WHERE y1 <> b1 AND y1 <> b2

然而,如果所有b1rel關系的A節點也不與其他某個B節點有rel關系(與b1b2不同),則對上述代碼段的以下重構只會中止查詢:

MATCH (y1:B)<-[:rel]-(a1)-[:rel]->(b1)
WHERE y1 <> b1 AND y1 <> b2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM