【问题标题】:Using property as edge label during relationship creation在关系创建期间使用属性作为边缘标签
【发布时间】:2020-02-03 22:13:37
【问题描述】:

我有以下 Neo4j 查询:

UNWIND [{s:"a"}, {s:"b"}] AS x
WITH x

MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
WITH y, z

MERGE (y)-[:x.s]->(z)

这个想法是使用 x.s 作为 y 和 z 之间的边的标签。但这会引发以下错误:

Neo.ClientError.Statement.SyntaxError:无效输入“。”:预期 标识符字符、空格、“|”、长度规范、a 属性映射或“]”(第 7 行,第 14 列(偏移量:101))“合并 (y)-[:x.s]->(z)" ^

执行此操作的适当查询是什么?提前致谢

【问题讨论】:

    标签: database neo4j cypher


    【解决方案1】:

    首先,您在第二个WITH 命令中丢失了x。其次,当关系类型实际上是变量的值时,您不能使用MERGECREATE 创建关系。你应该改用apoc.create.relationship

    UNWIND [{s:"a"}, {s:"b"}] AS x
    WITH x
    
    MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
    WITH y, z, x
    
    CALL apoc.create.relationship(y, x.s, {},z) YIELD rel
    RETURN *
    

    【讨论】:

    • 欣赏答案。我会选择你的最好的。出于好奇,这是实现这一目标的唯一方法(使用 create.relationship 过程)吗?此外,该过程中的 {} 中有什么内容?是关系属性吗?
    • 谢谢。是的,因为您无法在创建关系时对关系类型进行参数化。 AFIK 这是唯一的方法。您是否有不喜欢此解决方案的特定要求?是的,您对 {} 的看法是正确的。
    【解决方案2】:

    我发现这可以使用apoc.create.relationship 过程来完成:

    UNWIND [{s:"c"}, {s:"d"}] AS x
    WITH x
    
    MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"}) 
    WITH y, z, x
    
    CALL apoc.create.relationship(y, x.s, {}, z) YIELD rel
    RETURN y,z
    

    我将把这个问题留一点,看看是否有人能想出更好的方法来做到这一点。

    【讨论】:

      【解决方案3】:

      使用PROFILE,您应该会看到此查询需要更少的数据库命中:

      MATCH (y:Y {b:"hi"}), (z:Z {b:"hi"})
      UNWIND ["c", "d"] AS x
      CALL apoc.create.relationship(y, x, {}, z) YIELD rel
      RETURN y,z
      

      另外,您应该在:X(b):Z(b) 上创建indexes 以提高性能。

      【讨论】:

      • 我看到的两个区别是“c”和“d”不再是属性值,只是列表中的值。我还看到此查询中未使用 WITH 。如果我还缺少其他内容,您能否解释一下此查询与之前建议的查询有何不同以及为什么它需要更少的数据库命中?
      • 我使用的东西是:(1)直觉-如果UNWIND先出现,似乎MATCH可以执行两次,所以我交换了两个子句并使用PROFILE检查并看到差异(尽管不一定是由于我的预期)。 (2) 简化(这通常也简化了生成的计划) - 同样,PROFILE 显示“c”/“d”简化减少了 DB 命中。注意:您的结果可能与我的不同,特别是如果您使用的是不同的 neo4j 版本,因此您应该始终自己运行 PROFILE 进行检查。
      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多