Neo4j Create cypher语句,用于创建或更新已存在(或不存在)的关系和道具
我正在尝试创建chyper语句: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
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)也一样,请参见我的更新答案。看起来您根本不需要使用正则表达式(也不应该)。