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)