我有一个约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)
)。
这里发生了什么?是否使用split
和UNWIND
?
将列内部的拆分数组制定为单个值的更好方法是什么,所有这些都链接回同一个节点?
编辑 - 我最近将我的数据样本减少到只有24行,只是为了确定我是否不够耐心。运行约10分钟后,查询仍然悬空。
编辑2 - 问题似乎与产生关系的MERGE有关。如果我只是从CSV返回数据(什么都不创建),它就可以了。如果我只创建:Tag
节点(没有来自(p)-[:tagged]->(t)
的关系),那么它可以工作。只有在最后一次关系合并时,查询才会挂起。
答案 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)
)