簡體   English   中英

在neo4j中讀取csv時,基於ID創建和推斷關系

[英]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          |
+------------+-------------+------------+-------------+

我正在嘗試制作一棵家譜,看起來像這樣:

在此處輸入圖片說明

這里的技巧是,我必須僅基於兩件事來創建這些關系: FatherIDMotherID 這是可聽的。 但這需要以某種條件方式應用關系。

這是我嘗試過的方法,但是沒有用:

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的過程。

我的一個主意是讓FatherIDMotherID 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關系,因為您可以僅通過匹配共享父母的人來確定兄弟關系。

這是一種可能滿足您需求的方法。

注意:我選擇使用FATHERMOTHER關系而不是CHILD來保留CSV文件中的語義信息。 如果您願意,可以簡化我的回答,僅使用CHILD

步驟1:生成所有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 ,以避免創建重復項。

第2步:生成所有關系(父親,母親,配偶)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM