Neo4j Cypher:将属性作为不同的值添加到关系中
我想做的是写一个查询——我已经把它做成了一个Web服务(在本地机器上工作,所以我得到了名字和人作为参数)——它连接那些拥有相同爱好的人,并将爱好设置为关系属性作为数组。 我的第一次尝试是Neo4j Cypher:将属性作为不同的值添加到关系中,neo4j,cypher,Neo4j,Cypher,我想做的是写一个查询——我已经把它做成了一个Web服务(在本地机器上工作,所以我得到了名字和人作为参数)——它连接那些拥有相同爱好的人,并将爱好设置为关系属性作为数组。 我的第一次尝试是 MERGE (aa:Person{name:$name}) WITH aa, $people as people FOREACH (person IN people | MERGE (bb:Person{name:person.name}) MERGE (bb)-[r:SHARESSAMEHOBBY]->
MERGE (aa:Person{name:$name})
WITH aa, $people as people
FOREACH (person IN people |
MERGE (bb:Person{name:person.name})
MERGE (bb)-[r:SHARESSAMEHOBBY]->(aa)
ON MATCH SET r.hobbies = r.hobbies + person.hobby
ON CREATE SET r.hobbies = [person.hobby])
但是,这会导致重复的属性元素,如[“swiming”、“swiming”]
我试图只设置唯一属性。然后我尝试了以下查询
MERGE (aa:Person{name:$name})
WITH aa, $people as people FOREACH (person IN people | MERGE (bb:Person{name:person.name}) MERGE (bb)-[r:SHARESSAMEHOBBY]->(aa)
WITH r, COALESCE(r.hobbies, []) + person.hobby AS hobbies
UNWIND hobbies as unwindedHobbies
WITH r, collect(distinct, unwindedHobbies) AS unique
set r.as = unique)
但是现在它给了我语法错误
errorMessage = "[Neo.ClientError.Statement.SyntaxError] Invalid use of WITH inside FOREACH
非常感谢您的帮助。这应该可以:
MERGE (aa:Person {name: $name})
WITH aa
UNWIND $people AS person
MERGE (bb:Person {name: person.name})
MERGE (bb)-[r:SHARESSAMEHOBBY]-(aa)
WITH r, person, CASE
WHEN NOT EXISTS(r.hobbies) THEN {new: true}
WHEN NOT (person.hobby IN r.hobbies) THEN {add: true}
END AS todo
FOREACH(ignored IN todo.new | SET r.hobbies = [person.hobby])
FOREACH(ignored IN todo.add | SET r.hobbies = r.hobbies + person.hobby);
实际上,您有两个问题,上面的查询解决了这两个问题:
SHARESSAMEHOBBY
关系已经存在于相反的方向(从aa
到bb
),下面的MERGE
子句将导致不必要地创建第二个SHARESSAMEHOBBY
关系(从bb
到aa
):
合并(bb)->(aa)
为了避免这种情况,您应该使用非定向关系模式(这是MERGE
允许的,但不是CREATE
)来匹配任一方向的关系,如下所示:
合并(bb)-[r:SHARESSAMEHOBBY]-(aa)业余爱好
列表,或者将person.hobby
值添加到一个现有的r.hobbies
列表中,该列表尚未具有该值。上述查询使用一个CASE
子句分配给todo
,NULL
,或一个带有键的映射,该键指示要执行的其他工作。然后它使用一个FOREACH
子句来执行每一件要做的事情当我尝试时,它会显示[Neo.ClientError.Statement.SyntaxError]无效输入'S':预期为'l/l',有什么想法吗?在测试我的答案时,我没有发现语法错误。您显然有打字错误或其他语法错误(例如,您是否在正确的位置使用了
和
)。在密码查询中哪里发现了错误?我发现了问题;我错过了一个“非常感谢”,它像一个魅力!