1

我正在使用 LOAD CSV 命令加载文件,但我遇到了一个奇怪的情况,当新行在“匹配”块中添加了一个属性时。

这是代码:

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 是唯一的,但我看到来自 Hit 类型的节点更新=xxx(我已经使用 grep [hit_id] 1.csv 使用文件验证了这些节点的 id 出现一次)

我很确定这条线有问题:

split(line.list_ites, ',') AS items UNWIND items AS _items 

或使用循环

帮助我们appritiated,

里奥

更新:

我删除了这一行:

 split(line.list_ites, ',') AS items UNWIND items AS _items 

还有foreach循环,实际上我没有看到任何具有价值的“更新”字段。我仍然必须修复它,因为我不能真正从最终代码中删除它

4

1 回答 1

0

这是因为它不仅合并,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. 特别是当你将它作为集合传递给 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)
  )
)

但更好的做法是把 unwind 移到最后:

...
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)
于 2015-06-07T21:03:00.013 回答