Neo4j Cypher:将属性作为不同的值添加到关系中

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]->

我想做的是写一个查询——我已经把它做成了一个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]->(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',有什么想法吗?在测试我的答案时,我没有发现语法错误。您显然有打字错误或其他语法错误(例如,您是否在正确的位置使用了
    )。在密码查询中哪里发现了错误?我发现了问题;我错过了一个“非常感谢”,它像一个魅力!