簡體   English   中英

如何從取決於節點類型的 csv 在 neo4j/Cypher 中創建關系?

[英]How can I create relationships in neo4j/Cypher from a csv that depend on the type of nodes?

我正在嘗試將 csv 導入 Neo4j ,其中包含人、組織、銀行、資產等之間的關系,其中每行只有一個關系。 列名是FROM、A.Type、TO、B.type ,然后是不同的屬性。 在這里,from 和 to 標簽有名字,AB.type 表示它是否屬於一個人、組織等。

我設法根據FOREACH的類型創建節點(大約 3500 個),如下所示:

FOREACH (_ IN CASE WHEN line.`A.type` = 'ASSET' THEN [1] ELSE [] END | MERGE (asset:Asset {Name:line.FROM}))

FOREACH (_ IN CASE WHEN line.`A.type` = 'BANK' THEN [1] ELSE [] END | MERGE (bank:Bank {Name: line.FROM}))

. . .

FOREACH (_ IN CASE WHEN line.`B.type` = 'ACTIVO' THEN [1] ELSE [] END | MERGE (asset:Asset {Name:line.TO}))

FOREACH (_ IN CASE WHEN line.`B.type` = 'BANCO' THEN [1] ELSE [] END | MERGE (bank:Bank {Name: line.TO}))

. . .

我現在的問題是創建每行的關系,我嘗試了許多不同的方法,但似乎沒有任何效果。 例如:

  1. 在這種情況下,我將FOREACH更改為兩個不同的節點,具體取決於它們是在 FROM 還是 TO 列上:
WITH 'link' as line
LOAD CSV WITH HEADERS FROM url AS line
WITH line WHERE line.FROM = 'ASSET' AND line.TO = 'ORGANIZATION'
MERGE (a1:Asset {Name:line.FROM})
MERGE (o2:Organization {Name:line.TO})
CREATE (a1)-[con:PROPERTY_OF]->(o2) 
  1. 我還嘗試了創建節點的代碼變體:

FOREACH(n IN (CASE WHEN line.`A.type` = 'ASSET' THEN [1] ELSE [] END) | FOREACH(t IN CASE WHEN line.`B.type` = 'ORGANIZATION' THEN [1] ELSE [] END | MERGE (asset)-[ao:CONNECTED_WITH]->(organization)))

  1. 這次我使用 APOC 庫嘗試根據 relashionship 類型生成動態關系:
WITH asset, organization, line
CALL apoc.create.relationship(asset, line.RelationshipType, NULL, organization) YIELD rel
RETURN asset, rel, organization

以及每個的不同變體,從頭開始創建節點或匹配它們。 每次查詢似乎有效時,它都會運行,但它不會創建任何關系,或者它會在 csv 中不存在的新節點之間創建單一關系,沒有名稱或 label。

我對 Cypher/Neo4j 完全陌生,並且不知所措,如果有人能指出我的錯誤以及如何糾正它們,將不勝感激。

先感謝您!

  • 您應該在適當的時候使用A.typeB.type
  • 由於節點已經存在,您應該將 2 個現有的MERGE子句替換為MATCH子句。
  • 如果要確保不創建重復的關系,則應使用MERGE而不是CREATE來創建關系。
  • 您可以使用 APOC 過程apoc.do.case來執行條件寫入操作。

例如:

LOAD CSV WITH HEADERS FROM 'file:///' AS line
CALL apoc.do.case([
  line.`A.type` = 'ASSET' AND line.`B.type` = 'ORGANIZATION',
    'MATCH (a:Asset {Name: line.FROM}), (b:Organization {Name: line.TO}) MERGE (a)-[:FOO]->(b) RETURN a, b',
  line.`A.type` = 'ASSET' AND line.`B.type` = 'BANCO',
    'MATCH (a:Asset {Name: line.FROM}), (b:Bank {Name: line.TO}) MERGE (a)-[:FOO]->(b) RETURN a, b',
  line.`A.type` = 'BANK' AND line.`B.type` = 'ACTIVO',
    'MATCH (a:Bank {Name: line.FROM}), (b:Asset {Name: line.TO}) MERGE (a)-[:FOO]->(b) RETURN a, b'
  ],
  '', // empty ELSE case
  {line: line}
  ) YIELD value
RETURN value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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