2017-07-08 61 views
0

我正在运行以下查询来更新两个节点和关系上的属性。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' 

此查询在大量运行时遇到问题。有没有更好的办法?

谢谢。

+0

你能解释一下你所说的“数量较多,”运行它是什么意思?请更新您的描述以给出有问题的查询的示例。 – InverseFalcon

回答

1

您可以使用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行应该在几秒钟内完成(这是最糟糕的情况)。 –

相关问题