通过CSV LOAD导入数据后,我想将导入的节点连接到DB中已有的客户节点。我们的想法是使用Label TICKET查找所有导入的节点,并运行结果集并创建关系。
以下是我提出的第一种方法的代码:
# Find nodes without relationship for label Ticket
MATCH (t:Ticket), (c:Customer)
WHERE NOT (t)--(c)
RETURN t.number as ticket_number, t.type as ticket_type,t.sid as ticket_sid
# Run through the resultset and execute for each found node
MATCH (t:Ticket { number: "xxx" }), (c:Customer {code: "xxx"})
MERGE (t)-[:IS_TICKET_OF]->(c);
有一个索引 ON:机票(号码) ON:客户(代码)
这种处理方式非常慢,并且需要几分钟才能运行CSV文件。我希望有一种方法可以优化查询,或者找到一种方法来创建丢失的关系,因为首先要查看它们然后再运行循环。
CSV加载是:
LOAD CSV FROM "file:c:..." AS csvLine
MERGE (t:Ticket { number: csvLine[0]})
也许在CSV导入中创建关系也很好 - 可能就像
MATCH (c:Customer {code:"xxx"})
MERGE (t) - [:IS_TICKET_OF]-> (c)
但我需要在查询中弄清楚如何从字段中提取代码,因为我在CSV导入中有类似“aaa / vvv / bbb / 1234”的内容,并且上面的匹配只需要aaa存储在客户节点中作为ID。
非常感谢任何提示。
谢谢!
答案 0 :(得分:1)
此查询是否适合您?
它将输入字符串的aaa
部分存储在num
中,确保存在具有该编号的票证,然后确保匹配客户之间存在关系(如果有这样的客户) )。
LOAD CSV FROM "file:c:..." AS csvLine
WITH SPLIT(csvLine[0], '/')[0] AS num
MERGE (t:Ticket {number: num})
WITH num, t
OPTIONAL MATCH (c:Customer {code: num})
MERGE (t)-[:IS_TICKET_OF]->(c);