2016-11-29 57 views
3

我有一個如下圖所示的圖表。 enter image description here如何爲這種情況編寫Cypher查詢?

WAR可以發佈多個服務,也可以發佈多個服務。

我的要求是獲得給定WAR的相關WAR。

我知道如何編寫查詢來獲得第一層依賴。

MATCH (w:WAR)-[:PUBLISH]->(s:SERVICE)<-[:DEPENDSON]-(otherWar:WAR) 

我的問題是如何獲得給定的WAR的多層依賴。

在這種情況下,在war1和war3之間,存在兩個PUBLISH/DEPENDSON關係。我如何用變長關係來描述這種關係?

回答

2

據我所知,沒有辦法在子圖上創建可變長度的路徑,也就是說你不能說明像(){-[: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}│ 
└────────────┴────────────┘ 
+1

我認爲這是一個很好的解決方案,但它看起來像你有:WAR_DEPENDS關係倒轉。如果'w'發佈'otherWar'所依賴的服務,則otherWar將依賴於w。 – InverseFalcon

+0

@InverseFalcon非常感謝你指出 - 最後的查詢也是錯誤的,因爲我通過了'war'和'otherWar'並重用它們。這顯然是錯誤的(它只提供直接連接),所以我修復並測試了查詢。 –

3

[已更新]

尋找一個戰爭取決於另一個的方式

假設PUBLISHDEPENDSON關係總是在SERVICE節點WAR節點和月底開始,我相信這個查詢會在其中找到war3(最終)取決於war1所有路徑。

MATCH p=(w:WAR {name:'war1'})-[:PUBLISH]-> 
()-[:PUBLISH|DEPENDSON*0..]-() 
    <-[:DEPENDSON]-(otherWar:WAR {name:'war3'}) 
RETURN p; 

使用相同的樣本數據由@GaborSzarnyas作爲呈現,上面的查詢會產生這樣的結果:

+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| p                                           | 
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| [Node[6]{name:"war1"},:PUBLISH[6] {},Node[9]{name:"s1"},:DEPENDSON[8] {},Node[7]{name:"war2"},:PUBLISH[10] {},Node[11]{name:"s3"},:DEPENDSON[11] {},Node[8]{name:"war3"}] | 
| [Node[6]{name:"war1"},:PUBLISH[7] {},Node[10]{name:"s2"},:DEPENDSON[9] {},Node[7]{name:"war2"},:PUBLISH[10] {},Node[11]{name:"s3"},:DEPENDSON[11] {},Node[8]{name:"war3"}] | 
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 

查找戰爭

這個查詢應該找到所有不同WAR節點的依賴取決於:war1

MATCH (w:WAR {name:'war1'})-[:PUBLISH]->()-[:PUBLISH|DEPENDSON*0..]-()<-[:DEPENDSON]-(otherWar:WAR) 
RETURN DISTINCT otherWar; 

結果是:

+----------------------+ 
| otherWar    | 
+----------------------+ 
| Node[7]{name:"war2"} | 
| Node[8]{name:"war3"} | 
+----------------------+ 
+1

雖然在這種情況下可行,但如果'w':War是'war3',它將在路徑上匹配另一個:WARs。據我所知,這種不同的關係可以與子圖中的每一場戰爭相匹配,我認爲這並不能滿足需求。 'war3'從未發佈過服務,所以沒有:戰爭依賴於它。 – InverseFalcon

+0

@InverseFalcon是的,我正在更新我的答案,以更具體。你能想出一個更新的答案可能出錯的方法嗎? – cybersam

+0

很棒的編輯,MATCH對我來說很好看!我正準備評論有關顯示僅獲得不同的獨立戰爭的查詢,但你擊敗了我! – InverseFalcon