2014-12-03 34 views
1

LOAD我想将导入的节点连接到已存在于数据库中的客户节点。这个想法是用Label TICKET查找所有导入的节点,并运行结果集并创建关系。neo4j通过CSV导入数据后优化关系检查(查询)

下面是代码我想出了第一种方法:

# 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

此查询是否适合您?

它将输入字符串的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);