讓我們考慮一個簡單的例子,有兩種類型的節點:公司和工人。對於任何一對公司c1和c2(我尊重一些我將忽略的條件),我需要知道:1.他們有多少共同工人,有多少工人有c1,有多少工人有c2。Neo4j Cypher路徑使用幾次相同的邊
我的第一個猜測是:
MATCH (w_c1:Worker)--(c1:Company)--(w_common)--(c2:Company)--(w_c2:Worker)
WHERE <something>
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1)
這一要求的問題是,如果我有任何對連接的節點,COUNT(DISTINCT w_c1)(ID爲w_c2)之間只有一個鏈接就只算c1中不屬於c2的工作人員。但是如果我在一些節點之間有幾個關係,結果有時候是「正確的」。這聽起來像比賽中的路徑不會「回來」:(w_common) - (c2:公司) - (w_c2:工人)將不匹配(「worker1」) - (「company2」) - ( 「worker1」)(這可能有助於避免無限循環)。
我的第二個猜測是兩個部分分割的要求: 我的第一個猜測是:
MATCH (c1:Company)--(w_common)--(c2:Company)
MATCH (c1)--(w_c1:Worker), (c2)--(w_c2:Worker)
WHERE <something>
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1)
不過,結果是正確的,但我有一個關於笛卡爾積的警告,而事實上,在大數據集,我的請求不會在數小時後完成。我在兩場比賽之間嘗試了「WITH c1,w_common,c2」,但我仍然有警告
我該如何繼續?
謝謝,我確實嘗試了SIZE函數,但是我可能在給定的公司和工人之間有幾個關係(例如對應於幾個工作階段)。 – Vandy
您是否有特定的「:HIRED」,每個工人只能出現一次?然後你可以做一些像'size((c1) - [:HIRED] - >())'。 –