当我们在neo4j中使用load csv(在cypher中)然后在那之后编写一些匹配或合并或创建语句时,后端究竟会发生什么?我猜测对CSV中的每一行反复执行相同系列的匹配和其他语句 . 我理解的关键部分是,每次执行这一系列语句时(对于csv中的每一行),搜索的数据是在上次执行前一个csv行的语句之后更新的数据 . 但是我在使用它时遇到了一个问题,它与这个信念相矛盾 . 所以如果有人能帮助我,我真的很感激 .

编辑:

问题是这样的:

1)假设CSV中只有2行有3列,三列是'StartDate','EndDate','Preference' . 我在DB中也有一个节点,标签为'Person'2)现在我想迭代这个CSV并为CSV中的所有不同Preferneces创建一个节点 . 在我这样做的同时,我还希望保持标签'Person'的节点与他的偏好之间的关系 . startDate和endDate基本上是java毫秒格式的时间 . 这表示一个人有某种“偏好”的时间范围 . 所以,我实际上在做什么

LOAD CSV  WITH HEADERS FROM 'file_location' as row
    MATCH (a:PERSON{name:'X'}) 
    WITH a, row
    MERGE (c:Preference{value: row.Preference}) 
    WITH row, c, a
    OPTIONAL MATCH (a)-[prevRelation:hasPreference{endDate:253402318799000}]->(:PREFERENCE) 
    WITH row, prevRelation, a, c  
    MERGE (a)-[currRelation: hasPreference]->(c) 
    ON CREATE SET currRelation.startDate = row.StartDate,
       currRelation.endDate = 253402318799000, 
       prevRelation.endDate = row.StartDate - 1000
    ON MATCH SET prevRelation.lastRefreshed = row.StartDate - 1000

253402318799000 - 就我而言,表示结束时间 .

解释:

(i)将'PERSON'节点与特定属性值匹配 - MATCH

(ii)在'PREFERENCE'标签节点上合并特定属性值 - MERGE

(iii)在(i)和(ii)中的两个节点之间查看是否存在与特定 property 的关系(该 property 表示该人的最新偏好) - 可选择的匹配

(iv)如果存在关系,则存在当前/最新关系,如果不存在,我将在变量'prevRelation'中将它与它相关联,它将为null

(v)现在,在(i)和(ii)的节点上进行合并,看看在没有属性的情况下是否存在相同的关系

(vi)在创建时,我为先前的关系设置了一些属性,基本上设置了它的endTime,然后为新创建的关系设置属性 - 这意味着首选项和人之间没有关系

(vii)在匹配时,我更新关系的属性,即最后刷新的时间 - 这意味着偏好与人之间存在关联