带有展开的阵列的LOAD CSV无法执行任何操作

时间:2014-11-26 16:45:20

标签: csv neo4j cypher

我有一个约9,000行员工数据的CSV文件。它包含一个名为" DeclaredTags"的列。其中包含单个字符串中的标记列表,例如"foo; bar; baz; quux"。一般人不到10人,有些人没有。

所有人都已加载到数据库中。我使用以下语句只加载标记:

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM 
'file:/path_to/people_26Nov14.csv'
AS l
MATCH (p:Person { empid: l.EmployeeNumber })
WHERE l.DeclaredTags <> ""
WITH l, split(l.DeclaredTags, "; ") AS tags, p
UNWIND tags as tag
MERGE (t:Tag {label: tag})
MERGE (p)-[:tagged]->(t);

这个查询只是永远地搅拌;我会定期尝试对所创建的标签数量进行计数,它总是为0.(即MATCH (t:Tag) return count(t))。

这里发生了什么?是否使用splitUNWIND

将列内部的拆分数组制定为单个值的更好方法是什么,所有这些都链接回同一个节点?

编辑 - 我最近将我的数据样本减少到只有24行,只是为了确定我是否不够耐心。运行约10分钟后,查询仍然悬空。

编辑2 - 问题似乎与产生关系的MERGE有关。如果我只是从CSV返回数据(什么都不创建),它就可以了。如果我只创建:Tag节点(没有来自(p)-[:tagged]->(t)的关系),那么它可以工作。只有在最后一次关系合并时,查询才会挂起。

1 个答案:

答案 0 :(得分:2)

你试过FOREACH吗?

USING PERIODIC COMMIT 500
LOAD CSV WITH HEADERS FROM 
'file:/path_to/people_26Nov14.csv'
AS l WITH l
WHERE l.DeclaredTags <> ""
MATCH (p:Person { empid: l.EmployeeNumber })
FOREACH(tag IN SPLIT(l.DeclaredTags, '; ') |
    MERGE (t:Tag {label: tag})
    MERGE (p)-[:tagged]->(t)
)