使用包含具有自由文本属性的节点的图表,我想识别与特定正则表达式匹配的节点,创建新的注释节点并将匹配的节点链接到注释节点。我尝试使用MERGE和CREATE UNIQUE,但是在两次尝试中都创建了几个相同的注释节点。如果能帮助我整理正确的密码命令,我将非常感激。以下是我尝试的一些代码:
MATCH (p:Paper), (a:Annotation {Keyword: 'cool'})
WHERE p.Title =~ ".*cool.*"
CREATE UNIQUE (p)-[:isRelatedTo]->(a);
或
MATCH (p:Paper) WHERE p.Title =~ ".*cool.*"
CREATE UNIQUE (p)-[:isRelatedTo]->(a:Annotation {Keyword: 'cool'});
或
MATCH (p:Paper) WHERE p.Title =~ ".*cool.*"
MERGE (p)-[:isRelatedTo]->(a:Annotation {Keyword: 'cool'});
先谢谢,皮埃尔。
答案 0 :(得分:2)
你的最终方法(在你的评论中)有这些缺点:
Annotation
节点已存在时才有效。EDITED
以下修改过的查询应该有效地解决上述问题的两个,并在必要时创建Annotation
节点。
MERGE
来创建Annotation
当且仅当它不存在时才会创建。{/ li>
CREATE UNIQUE
关系尚未存在,则使用isRelatedTo
创建term
关系。Keyword
参数(并用作Annotation
的{{1}})。将字符串作为参数传递可以使查询更快。MATCH (p:Paper) WHERE p.Title =~ (".*" + {term} + ".*") MERGE (a:Annotation {Keyword: {term}}) CREATE UNIQUE (p)-[:isRelatedTo]->(a) RETURN p, a;
转到this console进行测试(不含term
参数)。
答案 1 :(得分:0)
回答我自己,以上的想法非常接近一个有效的解决方案,只缺少一个WITH语句。
MATCH (p:Paper) WHERE p.Title =~ ".*cool.*"
MERGE (a:Annotation {Keyword: "cool"})
WITH a, p merge (a) <-[:isRelatedTo]- (p)
RETURN p
此查询在必要时创建:Annotation节点并链接:与正则表达式匹配的纸质节点。
谢谢大家的帮助。