将 csv 中的节点与 Neo4J 中的列名相关联
Relating nodes in csv with column names in Neo4J
我有一个以下格式的 csv 文件,
- 有 n 个不同位置的位置列。
- 末尾有 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 设置为关系上的 属性。然后你可以用纯密码来做到这一点。
- 您使用复数形式作为节点标签。由于标签是一种标记,请考虑使用单数形式。
我有一个以下格式的 csv 文件,
- 有 n 个不同位置的位置列。
- 末尾有 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 设置为关系上的 属性。然后你可以用纯密码来做到这一点。
- 您使用复数形式作为节点标签。由于标签是一种标记,请考虑使用单数形式。