我有两个标签的节点: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是否可行。
感谢您的帮助!
答案 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