Neo4j Create cypher语句,用于创建或更新已存在(或不存在)的关系和道具

Neo4j Create cypher语句,用于创建或更新已存在(或不存在)的关系和道具,neo4j,cypher,Neo4j,Cypher,我正在尝试创建chyper语句: 如果两个节点之间不存在关系,我将创建它 修改它的属性 所以我想到了这个: String modifyRelations="match (p1:User),(p2:User) " + "WHERE p1.userId=~{1} and p2.userId=~{2} "+ "MERGE (p1)-[r:follow]->(p2)"+ "SET

我正在尝试创建chyper语句:

  • 如果两个节点之间不存在关系,我将创建它
  • 修改它的属性
  • 所以我想到了这个:

    String modifyRelations="match (p1:User),(p2:User) " +
                        "WHERE p1.userId=~{1} and p2.userId=~{2} "+
                        "MERGE (p1)-[r:follow]->(p2)"+
                        "SET follow.followType={3}";
    
    
            final PreparedStatement ps1 = conn.prepareStatement(modifyRelations);
                ps1.setString(1, sourceNodeDTO.getUserId());
                ps1.setString(2, targetNodeDTO.getUserId());
                ps1.setString(3, followTypes.getValue());
    
    我得到一个错误:

    Neo.ClientError.Statement.InvalidSyntax, message=follow not defined
    
    问题是,我不想创造新的关系,以防它已经存在

    如果存在,我只想修改其中的属性(follow)。 但是如果关系不存在,我想创建它,并在其中设置follow属性

    谢谢,, 雷。

    [更新]

    对原问题的答复 看起来您唯一需要更改的是
    SET
    子句。它需要通过其标识符(
    r
    )引用关系,而不是其关系类型:

    "SET r.followType={3}";
    
    MERGE
    子句只会在匹配的
    p1
    p2
    节点之间创建一个新的
    follow
    关系(如果尚未存在)。它将匹配(而不是创建)现有的
    follow
    关系,即使它有额外的属性键/值

    但是,您还应该更改
    WHERE
    子句,因为正则表达式没有为您做任何直接字符串比较所不能做的事情。在Cypher中,正则表达式匹配整个值,并且由于正则表达式不使用通配符,也不区分大小写,因此应该只使用简单的字符串比较。正则表达式也比简单的字符串比较慢

    String modifyRelations=
        "MATCH (p1:User), (p2:User) " +
        "WHERE p1.userId={1} and p2.userId={2} "+
        "MERGE (p1)-[r:follow]->(p2)"+
        "SET r.followType={3}";
    
    对评论中问题的答复 要回答下面评论中的后续问题,此查询还将创建
    p1
    和/或
    p2
    (如果两者都不存在):

    String modifyRelations=
        "MERGE (p1:User {userId: {1}})" +
        "MERGE (p2:User {userId: {2}})" +
        "MERGE (p1)-[r:follow]->(p2)"+
        "SET follow.followType={3}";
    

    您混淆了变量/标识符(在您的例子中是
    r
    )和关系类型
    follow

    这是一个很好的做法,所有的上限的rel类型,然后它是更明显的

    也就是说,
    遵循

    MATCH (p1:User),(p2:User)
    WHERE p1.userId=~{1} and p2.userId=~{2} 
    MERGE (p1)-[r:FOLLOW]->(p2)
    ON CREATE SET SET r.followType={3}
    

    您可能还希望在创建集合时使用
    ,而不是简单、无条件的
    集合

    ,这样就可以了。谢谢请升级此语句,并添加同一查询,以便在不存在关系的情况下创建具有关系的两个节点?如果它们存在只是为了更新它们之间的关系,谢谢。您当前在每个
    WHERE
    子句上使用正则表达式。创建
    用户
    时(如果未找到匹配的
    用户
    ),您希望对
    用户ID
    使用什么?或者,完全去掉正则表达式可以吗?userId是我图形中的索引。它的主键是uniqe。如果userId不是exit,我想创建一个新节点,该节点包含图形上的userId属性。其他用户(p2)也一样,请参见我的更新答案。看起来您根本不需要使用正则表达式(也不应该)。