[英]Neo4j - Create relationship between nodes based on property
我在图中有节点。 节点有两种类型; 让我们称他们为group a
和group b
。 我拥有group a
和group b
中的节点之间的关系映射,该映射基于每个节点中的name
属性。 为清楚起见,映射文件看起来有点像这样:
(:a {name:'abc'})-[:RELATES_TO]->(:b {name:'def'}),
(:a {name:'abd'})-[:RELATES_TO]->(:b {name:'def'}),
...
(:a {name:'uvw'})-[:RELATES_TO]->(:b {name:'xyz'})
组之间的name
不共享,所以我不能使用类似的名称:
MATCH (a),(b)
WHERE a.name = b.name
MERGE (a)-[:RELATES_TO]->(b)
由于现有节点包含多个属性,但映射仅包含name
属性,使用以下MERGE
会导致生成新节点,而不是连接我现有的节点:
MERGE
(:a {name:'abc'})-[:RELATES_TO]->(:b {name:'def'}),
(:a {name:'abd'})-[:RELATES_TO]->(:b {name:'def'}),
...
(:a {name:'uvw'})-[:RELATES_TO]->(:b {name:'xyz'})
我相信可以通过手动将所有属性添加到映射文件并运行上述合并来单独实现每个关系,但我相信添加关系的所有信息已经存在; 我有每个关系的起点和终点。 因此,我怀疑必须有一种更优雅的方法来解决这个问题。
在我过去使用 Neo4j 的经验中,出现上述问题是相当普遍的 -> 我不清楚我是否缺少一些语法知识,这是一个简单的解决方法,或者我是否滥用 Neo4j 的操作方式,我需要重新考虑我是如何进行的。
问题可能是由于您MERGE
了整个模式,这将导致创建整个模式。 假设name
属性作为唯一键,我建议你试试这个:
// make sure you have a list of a,b combinations, resulting from previous processing
a,b
'abc','def'
'abd','def'
...
'uvw','xyz''
// process these combinations
WITH a,b
MERGE (a:a {name:a})
MERGE (b:b {name:b})
MERGE (a)-[:RELATES_TO]->(b)
请注意,在name
属性上创建一个CONSTRAINT
会加快速度
create
(:a {name:'abc'}),
(:a {name:'abd'}),
(:a {name:'uvw'}),
(:b {name:'def'}),
(:b {name:'def'}),
(:b {name:'xyz'})
导航到设置。 添加检查以Enable multi statement query editor
分号表示查询的结束。 这就是您利用多语句查询编辑器的方式。
match(a:a {name:'abc'}),(b:b {name:'def'})
merge(a)-[:RELATES_TO]->(b);
match(a:a {name:'abd'}),(b:b {name:'def'})
merge(a)-[:RELATES_TO]->(b);
match(a:a {name:'uvw'}),(b:b {name:'xyz'})
merge(a)-[:RELATES_TO]->(b);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.