[英]Neo4J Enforce Unique Relationships bertween Nodes when reading from CSV
[英]create and infer relationships based on ID when reading in a csv in neo4j
我有一個簡單的csv,有4行,看起來像這樣:
+------------+-------------+------------+-------------+
| ID | Name | FatherID | MotherID |
+------------+-------------+------------+-------------+
| 1 | Mom Doe | | |
| 2 | Dad Doe | | |
| 3 | Big Sis | 2 | 1 |
| 4 | Lil Bro | 2 | 1 |
+------------+-------------+------------+-------------+
我正在嘗試制作一棵家譜,看起來像這樣:
這里的技巧是,我必須僅基於兩件事來創建這些關系: FatherID
和MotherID
。 這是可聽的。 但這需要以某種條件方式應用關系。
這是我嘗試過的方法,但是沒有用:
LOAD CSV WITH HEADERS FROM
'file:///Users/.../import_for_Neo4j.csv' AS line
WITH line
CREATE (person:Person {id:line.ID})
SET person.Name=line.Name,
person.MotherID=line.MotherID,
person.FatherID=line.FatherID
WITH person
CREATE (a:Person {Name:'Mom Doe'})-[:SPOUSE]->(b:Person {Name:'Dad Doe'})
RETURN a
但是后來我意識到,即使這確實可行,那有什么意義呢? 我必須手動輸入每個家庭成員的姓名,這將一開始否定加載csv的整個目的。 如果真是這樣,我不妨手動在Sublime中鍵入所有內容,並跳過閱讀csv的過程。
我的一個主意是讓FatherID
和MotherID
NULL的任何人都成為SPOUSE的MotherID
,但是如果家譜中有祖父母,那是行不通的。
解決方案似乎非常棘手-可能首先創建所有節點並創建SIBLING
關系。 然后遍歷csv並產生CHILD
關系?
我通常可以通過什么方法來制作CSV並創建此簡單圖形嗎?
感謝您閱讀本文。
這遠不能有效,具體取決於您的數據集,這需要大量調整,但是對於此基本數據集,它的工作原理是:
LOAD CSV WITH HEADERS FROM
'file:///test.csv' AS line
WITH line
CREATE (p:Person {id: line.id})
SET p.name = line.name, p.motherId = line.motherId, p.fatherId = line.fatherId
WITH p
MATCH (p1:Person), (p2:Person)
WHERE p.fatherId = p1.id AND p.motherId = p2.id
MERGE (p1)-[:SPOUSE]->(p2);
效率問題將來自MATCH部分中的笛卡爾積。
我添加了另一個技巧,我用零填充了空的父母ID。
更新
與孩子父母的關系:
LOAD CSV WITH HEADERS FROM
'file:///test.csv' AS line
WITH line
CREATE (p:Person {id: line.id})
SET p.name = line.name, p.motherId = line.motherId, p.fatherId = line.fatherId
WITH p
MATCH (p1:Person), (p2:Person)
WHERE p.fatherId = p1.id AND p.motherId = p2.id
MERGE (p1)-[:SPOUSE]->(p2)
WITH p
MATCH (father:Person)
WHERE p.fatherId = father.id
MERGE (p)-[:PARENT {type: 'FATHER'}]->(father)
WITH p
MATCH (mother:Person)
WHERE p.motherId = mother.id
MERGE (p)-[:PARENT {type: 'MOTHER'}]->(mother);
不需要SIBLING
關系,因為您可以僅通過匹配共享父母的人來確定兄弟關系。
這是一種可能滿足您需求的方法。
注意:我選擇使用FATHER
和MOTHER
關系而不是CHILD
來保留CSV文件中的語義信息。 如果您願意,可以簡化我的回答,僅使用CHILD
。
Person
節點 LOAD CSV WITH HEADERS FROM 'file:///Users/.../import_for_Neo4j.csv' AS line
MERGE (p:Person {id: line.ID, name: line.Name});
請注意,我使用MERGE
而不是CREATE
,以避免創建重復項。
LOAD CSV WITH HEADERS FROM 'file:///Users/.../import_for_Neo4j.csv' AS line
MATCH (p:Person {id: line.ID})
WITH p, line
OPTIONAL MATCH (m:Person {id: line.MotherID})
FOREACH (x IN CASE WHEN m IS NULL THEN [] ELSE [1] END | MERGE (p)-[:MOTHER]->(m))
WITH p, m, line
OPTIONAL MATCH (f:Person {id: line.FatherID})
WITH p, m, f
FOREACH (x IN CASE WHEN f IS NULL THEN [] ELSE [1] END | MERGE (p)-[:FATHER]->(f))
FOREACH (y IN CASE WHEN m IS NULL OR f IS NULL THEN [] ELSE [1] END | MERGE (m)-[:SPOUSE]->(f))
結果和樣本數據如下所示:
您將在這里找到“ Lil Bro”的所有兄弟姐妹:
MATCH (child:Person {name:'Lil Bro'})-[:MOTHER|FATHER]->()<-[:MOTHER|FATHER]-(sibling)
RETURN child, COLLECT(DISTINCT sibling)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.