在创建关系期间使用属性作为边缘标签



我有以下 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(" ^

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

首先,你在第二个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 *

我发现这可以使用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

我将暂时搁置这个问题,看看是否有人可以想出更好的方法来做到这一点。

使用 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)上创建索引以提高性能。

最新更新