neo4j中的LOAD CSV如何正常工作

时间:2016-09-13 20:19:28

标签: neo4j cypher

当我们在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,我更新关系的属性,即最后刷新的时间 - 这意味着首选项和人之间存在关系

0 个答案:

没有答案