據我所知,沒有辦法在子圖上創建可變長度的路徑,也就是說你不能說明像(){-[:PUBLISH]->(:SERVICE)<-[:DEPENDSON]-}*()
這樣的東西。
我複製你的樣本數據集與此代碼:
CREATE
(war1:WAR {name: 'war1'}),
(war2:WAR {name: 'war2'}),
(war3:WAR {name: 'war3'}),
(s1:SERVICE {name: 's1'}),
(s2:SERVICE {name: 's2'}),
(s3:SERVICE {name: 's3'}),
(war1)-[:PUBLISH]->(s1),
(war1)-[:PUBLISH]->(s2),
(war2)-[:DEPENDSON]->(s1),
(war2)-[:DEPENDSON]->(s2),
(war2)-[:PUBLISH]->(s3),
(war3)-[:DEPENDSON]->(s3)
如果這是可能在你的使用情況,您在圖形中插入額外的邊緣:
MATCH (w:WAR)-[:PUBLISH]->(s:SERVICE)<-[:DEPENDSON]-(otherWar:WAR)
MERGE (w)<-[:WAR_DEPENDS]-(otherWar)
,並使用這些遍歷:
MATCH (w1:WAR)-[:WAR_DEPENDS*]->(w2:WAR)
RETURN w1, w2
這給:
╒════════════╤════════════╕
│w1 │w2 │
╞════════════╪════════════╡
│{name: war1}│{name: war2}│
├────────────┼────────────┤
│{name: war1}│{name: war3}│
├────────────┼────────────┤
│{name: war2}│{name: war3}│
└────────────┴────────────┘
如果你不想堅持這種優勢,關鍵是要在一個查詢中運行這個和不提交事務:
MATCH (w:WAR)-[:PUBLISH]->(s:SERVICE)<-[:DEPENDSON]-(otherWar:WAR)
MERGE (w)<-[:WAR_DEPENDS]-(otherWar)
WITH otherWar AS w1
MATCH (w1)-[:WAR_DEPENDS*]->(w2:WAR)
RETURN DISTINCT w1, w2
這又導致:
╒════════════╤════════════╕
│w1 │w2 │
╞════════════╪════════════╡
│{name: war2}│{name: war1}│
├────────────┼────────────┤
│{name: war3}│{name: war1}│
├────────────┼────────────┤
│{name: war3}│{name: war2}│
└────────────┴────────────┘
我認爲這是一個很好的解決方案,但它看起來像你有:WAR_DEPENDS關係倒轉。如果'w'發佈'otherWar'所依賴的服務,則otherWar將依賴於w。 – InverseFalcon
@InverseFalcon非常感謝你指出 - 最後的查詢也是錯誤的,因爲我通過了'war'和'otherWar'並重用它們。這顯然是錯誤的(它只提供直接連接),所以我修復並測試了查詢。 –