在Neo4j节点之间创建关系

时间:2016-03-08 16:43:18

标签: neo4j cypher

我有两个标签的节点:Country和Continent。

每个国家都有一个名为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是否可行。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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节点存在,并在每个MERGE上执行Country以确保它与Continent有关系,并返回每个大陆代码及其国家集合。

答案 1 :(得分: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