2016-03-05 131 views
0

如何设置属性名称和它的值加载高瘦的CSV文件? csv文件将只包含3列,节点名称(id),属性名称(p)和属性值(v)。具有属性的节点因此将对应于2行。如何在csv加载时设置属性名称和值?

LOAD CSV... row 
MERGE (n) WHERE n.Name = row.id 
SET n.{row.p} = row.v 

此语法不退出它只是为了解释我想要做什么。有没有办法在cypher中做这样的事情?这是非常有用的,而不是必须先转换数据。

一个文件包含定义为个人节点:

Name,Age 
A,25 
B,34 

第二个文件包含特定节点的属性,每行一个属性

Name,property_name,property_value 
A,weight,64 
A,height,180 
B,hair color,blond 

我想更新节点A和B根据第二个文件设置其他属性。

正如下面提到的,一种可能性是创建(:数据),包含每一个属性节点,并将其链接的个人节点

CREATE (p) -[:hasProperty]-> (:Data {Name: row.property_name, Value: row.property_value}) 

然而,这可能不是非常有效和提取个人节点和属性得到更复杂。

MATCH (p:Person) --> (d:Data) 
RETURN {name: p.name, age: p.age, property_names: collect(d.Name), property_values: collect(d.Value)} 

Graal可以是在加载时动态设置属性名称,也可以是在节点上返回数据属性的透视函数。

回答

0

您无法从参数动态分配属性键,但由于该行是地图,你可以设置所有的行为节点 上的属性,如果它是确定你:

LOAD CSV ... AS row 
MERGE (n:Label {Name: row.id}) 
SET n += row 

编辑

根据您的编辑,你的第二个文件,如果没有像体重,身高等太多不同的值..你可以创建一个条件集,例如:

LOAD CSV WITH ... AS row 
WITH row, CASE row.property_name WHEN weight THEN [1] ELSE [] END as loopW 
UNWIND loopW as w 
MATCH (p:Person {name: row.Name}) 
SET p.weight = row.property_value 
WITH row, CASE row.property_name WHEN height THEN [1] ELSE [] END as loopH 
UNWIND loopH as h 
MATCH (p:Person {name: row.Name}) 
SET p.height = row.property_value 
... 
+0

我目前无法尝试。看起来很有趣。那么你将如何访问节点中的属性?当我尝试n = row时,我最终以n.property_name和n.proverty_value作为节点属性,分别包含实际的属性名称和值。用n + =行我会得到一个两个数组的property_name和_value? – Pierre

+0

那么,如果你的列标题是名称,那么你将有一个属性n.Name,同样适用于所有的柱子。 + =基本上更新了属性映射,其中as =将删除不在行中的其他节点属性 –

+0

高级瘦子csv有3列,id,p和v。P可以是与名称id节点相关的年龄,大小和高度。我的猜测是,n + =行将重写p和v。我的工作是创建属性节点并将它们链接到节点,但因此问题在查询级别相同(请参阅我的其他帖子),如果您想要报告一个节点及其属性节点中保存的属性。我实际上缺少了透视函数。 – Pierre

相关问题