2017-10-19 298 views
0

我想在neo4j中共享屬性的節點之間創建邊。 每個節點有5個屬性,分別是a,b,c,d,e。如果2個節點僅共享屬性'a',則邊緣將具有名稱'a'。如果2個節點共享屬性b,d,e,則邊緣將具有'bde'的名稱。對於每一對,如果它們共享屬性,那麼我只想創建一條邊。 謝謝。如何在neo4j中的節點間創建條件邊緣?

+0

有一些信息會幫助回答你的問題。 1.邊緣名稱,你的意思是邊緣的「類型」? 2.如果是這樣,你可以使用[APOC庫](https://neo4j-contrib.github.io/neo4j-apoc-procedures/)嗎? –

回答

2

此查詢應該創建與具有(任何屬性值即份額)每對節點之間的相同值的屬性的name一個FOO關係:

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, [x IN KEYS(m) WHERE m[x] = n[x] | x] AS common_keys 
FOREACH (k IN common_keys | CREATE (m)-[:FOO {name: k}]->(m)) 

WHERE ID(m) < ID(n)子句防止mn從是同一個節點,並且還可以防止對同一對的重複評估。

[更新]

如果你只想要2個節點之間的單一FOO關係,即使它們共享多個屬性值,那麼這個查詢應該工作:

MATCH (m), (n) 
WHERE ID(m) < ID(n) 
WITH m, n, 
    REDUCE(s = '', k IN KEYS(m) | CASE m[k] WHEN n[k] THEN s + k ELSE s END) AS common_keys 
WHERE common_keys <> '' 
CREATE (m)-[:FOO {name: common_keys}]->(m) 
+0

謝謝。您的查詢創建多個邊。所以我做了一個改變,用'ade'這樣的名字來創造單一邊緣。 – Neo

+0

感謝您的更新@cybersam。有沒有更有效的方法來處理大型數據集。謝謝! – Neo

+0

這個查詢產生笛卡爾積和我的數據的大小非常大(〜100萬)。有沒有更有效的方法來創建邊緣。謝謝! – Neo

相關問題