在匹配时创建节点,并链接到现有节点

时间:2014-05-08 20:26:11

标签: neo4j cypher

使用包含具有自由文本属性的节点的图表,我想识别与特定正则表达式匹配的节点,创建新的注释节点并将匹配的节点链接到注释节点。我尝试使用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'});

先谢谢,皮埃尔。

2 个答案:

答案 0 :(得分:2)

你的最终方法(在你的评论中)有这些缺点:

  1. 仅当适当的Annotation节点已存在时才有效。
  2. 你在2个地方硬编码“酷”字符串。我认为你真正想要的是能够用任何字符串做同样的事情。
  3. EDITED

    以下修改过的查询应该有效地解决上述问题的两个,并在必要时创建Annotation节点。

    1. 使用MERGE来创建Annotation当且仅当它不存在时才会创建。{/ li>
    2. 如果CREATE UNIQUE关系尚未存在,则使用isRelatedTo创建term关系。
    3. 它允许您为要过滤的字符串指定Keyword参数(并用作Annotation的{​​{1}})。将字符串作为参数传递可以使查询更快。
    4. 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节点并链接:与正则表达式匹配的纸质节点。

谢谢大家的帮助。