繁体   English   中英

Neo4j - 基于属性创建节点之间的关系

[英]Neo4j - Create relationship between nodes based on property

我在图中有节点。 节点有两种类型; 让我们称他们为group agroup b 我拥有group agroup 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM