Merge neo4j加载csv无效“;“论比赛”;
我正在使用loadcsv命令加载一个文件,我遇到了一个奇怪的情况,当一个新行在“onmatch”块中添加了一个属性时 代码如下:Merge neo4j加载csv无效“;“论比赛”;,merge,neo4j,load-csv,Merge,Neo4j,Load Csv,我正在使用loadcsv命令加载一个文件,我遇到了一个奇怪的情况,当一个新行在“onmatch”块中添加了一个属性时 代码如下: 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 (s
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)
)
由于hit_id是唯一的,
然而,我看到了updated=xxx的Hit类型的节点(我已经用grep[Hit_id]1.csv文件验证了这些节点的id出现一次)
我很确定这条线路有问题:
split(line.list_ites, ',') AS items UNWIND items AS _items
split(line.list_ites, ',') AS items UNWIND items AS _items
还是用循环
帮助我们认识到
狮子座
更新:
我删除了这一行:
split(line.list_ites, ',') AS items UNWIND items AS _items
split(line.list_ites, ',') AS items UNWIND items AS _items
还有foreach循环,实际上我没有看到任何有值的“更新”字段。我仍然必须修复它,因为我不能真正从最终代码中删除它,这是因为它不仅在
hit\u id
上合并,而且在date\u 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()
更新
您对\u项所做的操作实际上毫无意义。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)
)
)
使用定期提交10000加载CSV,其中包含来自的标题'file://1.csv'
AS行字段终止符“|”
合并(会话:会话{wz_会话:line.session})
在创建SET session.created=timestamp()时,session.batch_id='60893068766'
在匹配集session.updated=timestamp()上
合并(hit:hit{id:line.hit\id,date\u-time:TOINT(line.date\u-time)})
创建时设置hit.created=timestamp()
匹配集上的hit.updated=timestamp()
FOREACH(_拆分中的项目(line.list_ites,,'))|
FOREACH(q IN(在修剪(行列表)时)&“然后_itemselse[]END)|
合并(i:ListItems{key:q,name:split(q,'='))[0],value:split(q,'='))[1]}
创建(点击)-[: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)
。。。
其中修剪(线条列表)&'
将拆分(line.list_ites,,')作为_项展开
将项目作为q展开
使用q,将(q,“=”)分割为部分,点击
在创建集i.name=parts[0],i.value=parts[1]上合并(i:ListItems{key:q})
创建(点击)-[:WITH_QUERY]->(i)
这是因为它不仅在hit\u id
上合并,而且在date\u 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()
更新
您对\u项所做的操作实际上毫无意义。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)
)
)
使用定期提交10000加载CSV,其中包含来自的标题'file://1.csv'
AS行字段终止符“|”
合并(会话:会话{wz_会话:line.session})
在创建SET session.created=timestamp()时,session.batch_id='60893068766'
在匹配集session.updated=timestamp()上
合并(hit:hit{id:line.hit\id,date\u-time:TOINT(line.date\u-time)})
创建时设置hit.created=timestamp()
匹配集上的hit.updated=timestamp()
FOREACH(_拆分中的项目(line.list_ites,,'))|
FOREACH(q IN(在修剪(行列表)时)&“然后_itemselse[]END)|
合并(i:ListItems{key:q,name:split(q,'='))[0],value:split(q,'='))[1]}
创建(点击)-[: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)
。。。
其中修剪(线条列表)&'
将拆分(line.list_ites,,')作为_项展开
将项目作为q展开
使用q,将(q,“=”)分割为部分,点击
在创建集i.name=parts[0],i.value=parts[1]上合并(i:ListItems{key:q})
创建(点击)-[:WITH_QUERY]->(i)
hi@michael hunger,事实并非如此。我已经在我的问题中添加了一个“更新”部分Hi@michael hunger,事实并非如此。我已经在我的问题中添加了一个“更新”部分Hi@michael hunger,事实并非如此。我已经在我的问题右侧添加了一个“更新”部分,将该字段展开成行,这肯定会创建重复项,因为每个输入行都是重复的,从开始,使用行,拆分(line.list_ites,,')作为项将项展开为_项
->您在查询中没有使用_项
?那么,你为什么要做放松呢?sopy粘贴问题。现在它出现在foreachit中,您对_items所做的操作毫无意义,可能只是使用一个内部foreach loopRight,将该字段展开成行,这肯定会创建重复项,因为每个输入行都是从开始重复的,使用line,split(line.list_ites,,)AS items将项目作为_items展开
->您在查询中没有使用
\u items
?那么,你为什么要做放松呢?sopy粘贴问题。现在它出现在foreachit中,您对_items所做的操作毫无意义,可能只是使用一个内部foreach loopRight,将该字段展开成行,这肯定会创建重复项,因为每个输入行都是从开始重复的,使用line,split(line.list_ites,,)AS items将项目作为_items展开
->您在查询中没有使用\u items?那么,你为什么要做放松呢?sopy粘贴问题。现在它出现在foreach中,您对_项所做的操作没有意义,可能只是使用了一个内部foreach循环