如何在csv load上设置属性名称和值?

时间:2016-03-05 08:54:28

标签: neo4j cypher

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

Name,Age
A,25
B,34

这种语法并不仅仅是为了解释我想做的事情。有没有办法在密码中做这样的事情?这非常有用,而不是必须首先转移数据。

文件包含人员节点的定义:

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

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

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

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

如下所述,一种可能性是创建(:Data)节点,每个节点包含一个属性,并将它们链接到人员节点

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

但是,这可能效率不高,并且提取人员节点和属性会变得更加复杂。

overflow: auto;

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

1 个答案:

答案 0 :(得分: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
...