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

Neo4j 在匹配时创建节点,并链接到现有节点,neo4j,cypher,Neo4j,Cypher,对于包含具有自由文本属性的节点的图,我想识别与特定正则表达式匹配的节点,创建一个新的注释节点,并将匹配的节点链接到注释节点。我尝试了“合并”和“创建唯一”,但是在这两种尝试中都创建了几个相同的注释节点。如果有人能帮我制定正确的密码命令,我将不胜感激。下面是我尝试过的一些代码: MATCH (p:Paper), (a:Annotation {Keyword: 'cool'}) WHERE p.Title =~ ".*cool.*" CREATE UNIQUE (p)-[:isRelatedTo

对于包含具有自由文本属性的节点的图,我想识别与特定正则表达式匹配的节点,创建一个新的注释节点,并将匹配的节点链接到注释节点。我尝试了“合并”和“创建唯一”,但是在这两种尝试中都创建了几个相同的注释节点。如果有人能帮我制定正确的密码命令,我将不胜感激。下面是我尝试过的一些代码:

MATCH (p:Paper), (a:Annotation {Keyword: 'cool'}) 
WHERE p.Title =~ ".*cool.*" 
CREATE UNIQUE (p)-[:isRelatedTo]->(a);

提前谢谢你,Pierre。

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

  • 仅当相应的
    注释
    节点已存在时,它才起作用
  • 您在两个位置硬编码“cool”字符串。我想你真正想要的是能够用任何字符串做同样的事情
  • 编辑

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

  • 它使用
    合并
    来:创建
    注释
    如果且仅当注释不存在时
  • 它使用
    CREATE UNIQUE
    创建
    isRelatedTo
    关系(如果该关系尚不存在)
  • 它允许您为要筛选的字符串指定
    术语
    参数(并用作
    注释
    关键字
    )。将字符串作为参数传递可以使查询更快

  • 去测试这一点(没有
    术语
    参数)。

    回答我自己,上面的想法非常接近一个可行的解决方案,只是缺少一个WITH语句

    MATCH (p:Paper) WHERE p.Title =~ ".*cool.*" 
    MERGE (a:Annotation {Keyword: "cool"}) 
    WITH a, p merge (a) <-[:isRelatedTo]- (p) 
    RETURN p
    
    匹配(p:Paper),其中p.Title=~“*cool.*”
    合并(a:Annotation{Keyword:“cool”})
    
    对于a,p merge(a),下面的代码最终起作用。如果有更好的解决方案,请随时发表意见。匹配(p:Paper),(a:Annotation{Keyword:“cool”}),其中p.Title=~“*cool.*”创建唯一(p)-[:isRelatedTo]->(a)返回p,a;事实上,我后来意识到它只适用于注释节点已经存在的示例。谢谢你指出这一点。在代码中,如何定义{term}?我主要使用RESTAPI来查询neo4j数据库,我应该使用“map”还是类似的东西(a:Annotation{Keyword:{term:'cool'}})?我刚刚查看了您的控制台,只有一个节点与'cool'匹配,您不可能看到创建的重复注释节点。我创建了纸节点“life is cool”和“life is hot”,因此使用您的查询对匹配“life”的节点进行注释,正如您在控制台中看到的,已经创建了两个:注释{Keyword:'life'}。我希望创建一个节点,并将匹配的纸张链接到该节点。您也可以使用Neo4j进行全文搜索,它应该比regexps更好地处理大量文本,请参阅:@user3195894:请查看我的更新答案。它现在使用
    MERGE
    来避免多次创建
    注释。我当然同意CreateUnique的行为不是我所期望的。
    
    MATCH (p:Paper) WHERE p.Title =~ ".*cool.*" 
    MERGE (p)-[:isRelatedTo]->(a:Annotation {Keyword: 'cool'});
    
    MATCH (p:Paper) WHERE p.Title =~ (".*" + {term} + ".*")
    MERGE (a:Annotation {Keyword: {term}})
    CREATE UNIQUE (p)-[:isRelatedTo]->(a)
    RETURN p, a;
    
    MATCH (p:Paper) WHERE p.Title =~ ".*cool.*" 
    MERGE (a:Annotation {Keyword: "cool"}) 
    WITH a, p merge (a) <-[:isRelatedTo]- (p) 
    RETURN p