Neo4J在一个查询中匹配并设置多个关系/节点
问题描述:
我正在运行以下查询来更新两个节点和关系上的属性。Neo4J在一个查询中匹配并设置多个关系/节点
我希望能够在一个查询中更新1,000个节点和相应的关系。
MATCH (p1:Person)-[r1:OWNS_CAR]->(c1:Car) WHERE id(r1) = 3018
MATCH (p2:Person)-[r2:OWNS_CAR]->(c2:Car) WHERE id(r2) = 3019
SET c1.serial_number = 'SERIAL027436', c1.signature = 'SIGNATURE728934',
r1.serial_number = 'SERIAL78765', r1.signature = 'SIGNATURE749532',
c2.serial_number = 'SERIAL027436', c2.signature = 'SIGNATURE728934',
r2.serial_number = 'SERIAL78765', r2.signature = 'SIGNATURE749532'
此查询在大量运行时遇到问题。有没有更好的办法?
谢谢。
答
您可以使用LOAD CSV。您的输入将包含Person和Car的密钥(不是id,不建议使用id),以及您需要设置的任何属性。例如
personId, carId, serial_number, signature
00001, 00045, SERIAL78765, SIGNATURE728934
00002, 00046, SERIAL78665, SIGNATURE724934
您的查询就会再是这样的:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///input.csv' AS row
MATCH (p:Person {personId: row.PersonId})-[r:OWNS_CAR]->(c:Car {carId: row.carId})
SET r.serial_number = row.serialnumber, c.signature = row.signature
请注意,您应该对人与车唯一约束,使这项工作。你可以做成千上万(甚至上百万),这样的速度非常快...
希望这有助于 汤姆
+0
感谢您的建议。我们用2k行的CSV文件尝试了一个LOAD CSV。 Neo4j花了这么长时间,我们放弃了。 – Kainan
+0
你对节点有独特的限制吗(并用它们来完成匹配)?你能分享你使用的LOAD CSV查询吗?除非你跳过很多圈,否则2k行应该在几秒钟内完成(这是最糟糕的情况)。 –
你能解释一下你所说的“数量较多,”运行它是什么意思?请更新您的描述以给出有问题的查询的示例。 – InverseFalcon