2016-03-08 218 views
1

我有兩個標籤的節點:Country和Continent。在Neo4j節點之間創建關係

每個國家都有一個名爲continent_code的屬性,我想創建所有國家與其對應大陸之間的關係。

什麼我能做到的只是創造一個給定的大陸這樣的關係:

MATCH (u:Country {continent_code:"NORAM"}), (a:Continent {code:"NORAM"}) 
MERGE (u)-[r:IS_COUNTRY_OF]->(a) 
RETURN u, a, r 

現在我想要做什麼更多的東西是這樣的:

MATCH (u:Country {continent_code: a:Continent.code}) 
MERGE (u)-[r:IS_COUNTRY_OF]->(a) 
RETURN u, a, r 

顯然,這不工作,但我不知道如何解決它,我甚至不知道在Neo4j/cypher中是否有可能。

感謝您的幫助!

回答

1

簡單結合MATCHMERGE

MATCH (u:Country) WHERE LENGTH(u.continent_code)>0 
MERGE (a:Continent {code: u.continent_code}) 
MERGE (u)-[r:IS_COUNTRY_OF]->(a) 
RETURN u,r,a 
+0

謝謝,這正是我想要的。 – DonTintoretto

+0

雖然這個查詢應該可以工作,但它會多次爲同一大洲調用MERGE(每個國家在該大陸一次)。 – cybersam

+0

@cybersam是的,你說得對,但世界上有多少個國家和大陸? :) –

0

如果我正確理解你的問題,我認爲一個簡單的國家和大陸搜索和創建關係將工作。在Country和Continent節點之間創建的關係(IS_COUNTRY_OF)並不需要Country節點上的屬性(continent_code)。

MATCH (ctry:Country),(cont:Continent) 
WHERE ctry.name = 'Some Country Name' AND cont.name = 'Some Cont Name' 
CREATE (ctry)-[r:IS_COUNTRY_OF]->(cont) 
RETURN ctry, r, cont 
2

這可能是你想要什麼:

MATCH (u:Country) 
WITH u.continent_code AS cc, COLLECT(u) AS countries 
MERGE (a:Continent { code: cc }) 
FOREACH (c IN countries | MERGE (c)-[r:IS_COUNTRY_OF]->(a)) 
RETURN cc, countries; 

它彙集了所有與同一大洲代碼的國家中,使用MERGE確保所需Continent節點存在,每個Country做了MERGE到確保它與其Continent有關係,並將其各個國家的代碼返回給它們。

+0

謝謝你,這確實是我想要的。最後,我決定接受其他答案,因爲對我來說似乎更簡單。但是還是非常感謝,能夠接受兩個答案會很好。 – DonTintoretto

+0

我的答案只在每個大陸調用一次MERGE。所以,它應該更有效率。 – cybersam

相關問題