neo4j 加载 csv 无效 "ON MATCH"
neo4j load csv invalid "ON MATCH"
我正在使用 LOAD CSV 命令加载文件,但我遇到了一个奇怪的情况,当新行在 "on match" 块中添加了 属性 时。
代码如下:
USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file://1.csv'
AS line
FIELDTERMINATOR '|'
WITH line, split(line.list_ites, ',') AS items UNWIND items AS _items
MERGE (session :Session { wz_session:line.session })
ON CREATE SET session.created = timestamp(),session.batch_id='60893068766'
ON MATCH SET session.updated = timestamp()
MERGE (hit :Hit { id:line.hit_id,date_time:TOINT(line.date_time) })
ON CREATE SET hit.created = timestamp()
ON MATCH SET hit.updated = timestamp()
FOREACH(q IN (CASE WHEN trim(line.list_ites) <> '&' THEN _items ELSE [] END) | //cypher doesn't have IF
MERGE (i:ListItems {key: q,name:split(q,'=')[0],value: split(q,'=')[1]})
CREATE (hit)-[:WITH_QUERY]->(i)
)
现在这条线永远不会发生
ON MATCH SET hit.updated = timestamp()
因为 hit_id 是独一无二的,
然而-我看到来自类型为 updated=xxx 的节点(我已经使用 grep [hit_id] 1.csv)
验证了这些节点的 ID 出现一次的文件
我很确定这一行有问题:
split(line.list_ites, ',') AS items UNWIND items AS _items
或循环
帮助我们,
李尔[=15=]
更新:
我删除了这一行:
split(line.list_ites, ',') AS items UNWIND items AS _items
还有 foreach 循环,实际上我没有看到任何 "updated" 字段有值。我仍然必须修复它,因为我无法真正将其从最终代码中删除
这是因为它不仅在 hit_id
上合并,而且在 date_time
上合并,正如您在 MERGE
子句
中指定的那样
您应该将其更改为:
MERGE (hit :Hit { id:line.hit_id })
ON CREATE SET hit.created = timestamp(), hit.date_time=TOINT(line.date_time)
ON MATCH SET hit.updated = timestamp()
更新
你用 _items
做的事情真的没有意义。 Esp 当你将它作为集合传递给 foreach 而它不能是一个集合时。
也许使用内部 foreach 循环:
USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file://1.csv'
AS line FIELDTERMINATOR '|'
MERGE (session :Session { wz_session:line.session })
ON CREATE SET session.created = timestamp(),session.batch_id='60893068766'
ON MATCH SET session.updated = timestamp()
MERGE (hit :Hit { id:line.hit_id,date_time:TOINT(line.date_time) })
ON CREATE SET hit.created = timestamp()
ON MATCH SET hit.updated = timestamp()
FOREACH (_items IN split(line.list_ites, ',') |
FOREACH(q IN (CASE WHEN trim(line.list_ites) <> '&' THEN _items ELSE [] END) |
MERGE (i:ListItems {key: q, name:split(q,'=')[0], value: split(q,'=')[1]})
CREATE (hit)-[:WITH_QUERY]->(i)
)
)
但最好将展开移动到最后:
...
WHERE trim(line.list_ites) <> '&'
UNWIND split(line.list_ites, ',') AS _items
UNWIND _items as q
WITH q,split(q,'=') as parts, hit
MERGE (i:ListItems {key: q}) ON CREATE SET i.name=parts[0], i.value=parts[1]
CREATE (hit)-[:WITH_QUERY]->(i)
我正在使用 LOAD CSV 命令加载文件,但我遇到了一个奇怪的情况,当新行在 "on match" 块中添加了 属性 时。
代码如下:
USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file://1.csv'
AS line
FIELDTERMINATOR '|'
WITH line, split(line.list_ites, ',') AS items UNWIND items AS _items
MERGE (session :Session { wz_session:line.session })
ON CREATE SET session.created = timestamp(),session.batch_id='60893068766'
ON MATCH SET session.updated = timestamp()
MERGE (hit :Hit { id:line.hit_id,date_time:TOINT(line.date_time) })
ON CREATE SET hit.created = timestamp()
ON MATCH SET hit.updated = timestamp()
FOREACH(q IN (CASE WHEN trim(line.list_ites) <> '&' THEN _items ELSE [] END) | //cypher doesn't have IF
MERGE (i:ListItems {key: q,name:split(q,'=')[0],value: split(q,'=')[1]})
CREATE (hit)-[:WITH_QUERY]->(i)
)
现在这条线永远不会发生
ON MATCH SET hit.updated = timestamp()
因为 hit_id 是独一无二的, 然而-我看到来自类型为 updated=xxx 的节点(我已经使用 grep [hit_id] 1.csv)
验证了这些节点的 ID 出现一次的文件我很确定这一行有问题:
split(line.list_ites, ',') AS items UNWIND items AS _items
或循环
帮助我们,
李尔[=15=]
更新:
我删除了这一行:
split(line.list_ites, ',') AS items UNWIND items AS _items
还有 foreach 循环,实际上我没有看到任何 "updated" 字段有值。我仍然必须修复它,因为我无法真正将其从最终代码中删除
这是因为它不仅在 hit_id
上合并,而且在 date_time
上合并,正如您在 MERGE
子句
您应该将其更改为:
MERGE (hit :Hit { id:line.hit_id })
ON CREATE SET hit.created = timestamp(), hit.date_time=TOINT(line.date_time)
ON MATCH SET hit.updated = timestamp()
更新
你用 _items
做的事情真的没有意义。 Esp 当你将它作为集合传递给 foreach 而它不能是一个集合时。
也许使用内部 foreach 循环:
USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM 'file://1.csv'
AS line FIELDTERMINATOR '|'
MERGE (session :Session { wz_session:line.session })
ON CREATE SET session.created = timestamp(),session.batch_id='60893068766'
ON MATCH SET session.updated = timestamp()
MERGE (hit :Hit { id:line.hit_id,date_time:TOINT(line.date_time) })
ON CREATE SET hit.created = timestamp()
ON MATCH SET hit.updated = timestamp()
FOREACH (_items IN split(line.list_ites, ',') |
FOREACH(q IN (CASE WHEN trim(line.list_ites) <> '&' THEN _items ELSE [] END) |
MERGE (i:ListItems {key: q, name:split(q,'=')[0], value: split(q,'=')[1]})
CREATE (hit)-[:WITH_QUERY]->(i)
)
)
但最好将展开移动到最后:
...
WHERE trim(line.list_ites) <> '&'
UNWIND split(line.list_ites, ',') AS _items
UNWIND _items as q
WITH q,split(q,'=') as parts, hit
MERGE (i:ListItems {key: q}) ON CREATE SET i.name=parts[0], i.value=parts[1]
CREATE (hit)-[:WITH_QUERY]->(i)