2016-03-08 213 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

相关问题