将 csv 中的节点与 Neo4J 中的列名相关联

Relating nodes in csv with column names in Neo4J

我有一个以下格式的 csv 文件,

  1. n 个不同位置的位置列。
  2. 末尾有 Token 列,其中每个位置行都与不同的标记相关联。

任务

将每个标记关联到每个位置列,以便关系以列名命名。

例子

我的密码

load csv with headers from "file:///locations.csv" as row with row where row is not null
merge (l1:locations {name:row.LOC_1})
merge (t:tokens {name:row.Token})
merge (l1) -[:LOC_1]->(t)

如您所见,此代码加载每一列并手动将它们与标记相关联,这是一项繁琐的任务。实际上,有 67 列,手动执行此操作需要花费大量时间。

要动态创建关系类型,您将需要 apoc library. And a bit of list comprehension。这使您可以这样做:

load csv with headers from "file:///locations.csv" AS row 
with row where row is not null

// create an array of maps, using the keys() function
with row.Token AS token,
     [key IN keys(row) WHERE key<>'Token' | {relType:key,location:row[key]}] as relTypeLocs
unwind relTypeLocs AS relTypeLoc
merge (l:locations {name:COALESCE(relTypeLoc.location,'Unknown')})
merge (t:tokens {name:token})
WITH l,t,
     relTypeLoc.relType AS relType
// use apoc to create the rels
CALL apoc.create.relationship(t,relType,{}, l) YIELD rel
RETURN rel

删除 'Unknown':

MATCH (l:locations {name:'Unknown'})
DETACH DELETE l

也就是说,有两件事需要考虑:

  • 您还可以将 LOC_1 .. LOC_N 设置为关系上的 属性。然后你可以用纯密码来做到这一点。
  • 您使用复数形式作为节点标签。由于标签是一种标记,请考虑使用单数形式。