neo4j优化关系检查(查询)

时间:2014-12-03 11:53:57

标签: neo4j cypher relation

通过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。

非常感谢任何提示。

谢谢!

1 个答案:

答案 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);