2017-06-22 103 views
1

在数据库中,我有一个标签Person,其中包含具有属性的节点:firstname, gender, lastname, idNeo4j MERGE创建新节点而不是使用现有节点

我有一个包含关系的信息,如CSV文件:

id sibling 
1 3,4,5 

我所要做的是创建在siblingid和值之间的关系。

我使用下面的代码可以这样做:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 
'file:///relationship.csv' AS line1 
WITH line1, split(line1.sibling, ",") as siblings 
UNWIND siblings as sibling 
MERGE (p:Person{id:line1.id}) 
MERGE (k:Person{id:sibling}) 
MERGE (p)-[:SIBLING_OF]->(k) 

但这种方法产生的连接,而不是已经存在于数据库中的节点,只有id属性的新节点。

奇怪的是,当我使用此查询:

MATCH (p:Person) 
WHERE p.id='123' 
RETURN p 

它只返回先前在数据库中(含ID,姓名,性别,姓氏和id属性)节点,而新创建的的关系,但是当我试图将其用于关系返回节点,如:

MATCH (p:Person)-[SIBLING_OF]-(k:Person) 
WHERE p.id='123 
RETURN p,k 

新创建k节点被返回的只有id财产。

有没有人知道我在做什么错误的查询?

回答

1

我希望您的CSV文件中有一些空白区域可以防止密码与原始节点匹配。

确保您对:Person(id)有约束或索引。

另外,您正在合并该用户的每个兄弟的id列,您可以将其移动一次并且仅执行一次。

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///relationship.csv' AS line1 
MERGE (p:Person {id: trim(line1.id)}) 
WITH p, line1, split(line1.sibling, ",") as siblings 
UNWIND siblings as sibling 
MERGE (k:Person {id: trim(sibling)}) 
MERGE (p)-[:SIBLING_OF]->(k) 
+0

正如您所建议的那样,问题在于CSV文件中的空白区域。删除,解决了这个问题。使用您的查询创建与新的空节点(他们没有任何财产)的关系。使用我提供的查询完成了这项工作。 – Porjaz

+0

对不起 - 我不小心将'p'从'WITH'子句中留下,导致空的节点。当你的版本只需要做一次的时候,它真的会不必要地匹配'id'列多次(对于每个兄弟)。 –