我有以下 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
。其次,当关系类型实际上是变量的值时,不能创建与MERGE
或CREATE
的关系。您应该改用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)
上创建索引以提高性能。