当我们在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)中两个节点之间是否存在与特定财产的关系(该财产表示该人的最新偏好) - 可选择的匹配
(iv)如果存在关系,则存在当前/最新关系,如果不存在,我将在变量'prevRelation'中将其存在,它将为null
(v)现在,在(i)和(ii)的节点上进行合并,看看在没有属性的情况下是否存在相同的关系
(vi)在创建时,我为先前的关系设置了一些属性,基本上设置了它的endTime,然后为新创建的关系设置属性 - 这意味着首选项和人之间没有关系
(vii)ON Match,我更新关系的属性,即最后刷新的时间 - 这意味着首选项和人之间存在关系