Database 在关系创建过程中将特性用作边标签
我有以下Neo4j查询:Database 在关系创建过程中将特性用作边标签,database,neo4j,cypher,Database,Neo4j,Cypher,我有以下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:输入“”无效:应为 标识符字符、空格“|”、长度规范、 属性映射或']'第7行第14列偏移量:101合并
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:输入“”无效:应为
标识符字符、空格“|”、长度规范、
属性映射或']'第7行第14列偏移量:101合并
y-[:x.s]>z^
这样做的合适查询是什么?提前感谢我发现这可以通过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
我会把这个问题留一点时间,看看是否有人能想出更好的方法来解决这个问题。我发现这可以通过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
我将把这个问题留一点时间,看看是否有人能想出更好的方法来做这件事。首先,你在第二个命令中失去了x。其次,当关系类型实际上是变量的值时,不能使用MERGE或create创建关系。您应该改用apoc.create.relationship:
首先,在第二个命令中失去x。其次,当关系类型实际上是变量的值时,不能使用MERGE或create创建关系。您应该改用apoc.create.relationship:
使用,您应该看到此查询需要更少的数据库命中:
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
另外,您应该在:Xb和:Zb上创建以提高性能。使用,您应该看到此查询需要更少的数据库命中:
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
此外,您应该在:Xb和:Zb上创建以提高性能。感谢您的回答。我会选你的最好。出于好奇,这是使用create.relationship过程实现这一点的唯一方法吗?还有,程序中的{}是什么?是关系属性吗?谢谢。是,因为在创建关系时无法参数化关系类型。阿菲克:这是唯一的办法。您是否有不喜欢此解决方案的特定需求?是的,关于{}你是正确的。感谢你的回答。我会选你的最好。出于好奇,这是使用create.relationship过程实现这一点的唯一方法吗?还有,程序中的{}是什么?是关系属性吗?谢谢。是,因为在创建关系时无法参数化关系类型。阿菲克:这是唯一的办法。您是否有不喜欢此解决方案的特定需求?是的,关于{}你是对的。我看到的两个区别是c和d不再是属性的值,只是列表中的值。我还看到在这个查询中没有使用WITH。如果我还遗漏了什么,你能解释一下这个查询与之前建议的查询有何不同,为什么它需要更少的DB点击量吗?我使用的东西是:1直觉-如果先放松,比赛可能会执行两次,因此,我交换了这两个子句,并使用PROFILE进行检查,发现了一个差异,尽管这不一定是由于我的预期。2简化,这通常也简化了生成的计划-同样,配置文件显示c/d简化减少了数据库点击。注意:您的结果可能与我的不同,特别是如果您使用的是不同的neo4j版本,因此您应该始终自己运行PROFILE进行检查。我看到的两个差异是c和d不再是属性值,而是列表中的值。我还看到在这个查询中没有使用WITH。如果我还遗漏了什么,你能解释一下这个查询与之前建议的查询有何不同,为什么它需要更少的DB点击量吗?我使用的东西是:1直觉-如果先放松,比赛可能会执行两次,因此,我交换了这两个子句,并使用PROFILE进行检查,发现了一个差异,尽管这不一定是由于我的预期。2简化,这通常也简化了生成的计划-同样,配置文件显示c/d简化减少了数据库点击。注意:您的结果可能与我的不同,特别是如果您使用的是不同的neo4j版本,所以您应该始终自己运行概要文件进行检查。