【发布时间】:2017-12-02 18:56:42
【问题描述】:
我正在尝试在 Neo4J 中加载一些数据。我有一个已经设置好的Person 节点。现在,这个节点需要有一个email 属性,它应该是一个数组(或集合)。基本上,email 属性需要有多个值,比如 -
email: ["abc@xyz.com", "abc@foo.com"]
我在这里遇到过类似的问题,但所有答案都表明要设置多个属性值在创建节点本身时。喜欢来自this 答案的这个查询 -
CREATE (e:Employee { name:"Sam",languages: ["C", "C#"]})
RETURN e
但我的问题是Person 节点已经创建,我现在需要在其上设置email 属性。
这是我必须加载的数据的一小部分 -
Personid|email
933|Mahinda933@hotmail.com
933|Mahinda933@yahoo.com
933|Mahinda933@zoho.com
1129|Carmen1129@gmail.com
1129|Carmen1129@gmx.com
1129|Carmen1129@yahoo.com
4194|Ho.Chi4194@gmail.com
4194|Ho.Chi4194@gmx.com
此外,数据来自包含数千行的 CSV 文件,因此我的查询需要是通用的,我无法为每个 Person 节点设置属性。
当我用这个子集测试电子邮件属性的创建时,我的第一次尝试是这样 -
MATCH (n:TESTPERSON{id:933})
SET n.email = "Mahinda933@hotmail.com"
RETURN n
MATCH (n:TESTPERSON{id:933})
SET n.email = "Mahinda933@yahoo.com"
RETURN n
正如我所想,这只是将email 属性覆盖为最近查询中的值。
查看此处和 Cypher 文档的答案后,我发现 Neo4J 允许您将数组/集合(相同类型的多个值)设置为属性值,然后我尝试了这个 -
// CREATE test node
CREATE (n:TESTPERSON{id:933})
RETURN n
// at this time, this node does not have any `email` property, so setup
// email as an array with one string value
MATCH (n:TESTPERSON{id:933})
SET n.email = ["Mahinda933@hotmail.com"]
RETURN n
// Now, using +=, I can append to the array of strings
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "Mahinda933@yahoo.com"
RETURN n
// add a third value to array
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "Mahinda933@zoho.com"
RETURN n
如您所见,email 属性现在有多个值。
但问题是,由于我的 CSV 文件有数千行,我需要一个通用查询来执行此操作。
我想根据文档here 使用CASE 语句,并尝试了这个 -
MATCH (n:TESTPERSON {id:933})
CASE
WHEN n.email IS NULL THEN SET n.email = [ "Mahinda933@hotmail.com"]
ELSE SET n.email = n.email + "Mahinda933@yahoo.com"
RETURN n
但这只会引发错误 - mismatched input CASE expecting ;。
我希望我可以将此查询用作我的 CSV 文件的通用方式 -
LOAD CSV WITH HEADERS FROM 'FILEURL' AS line FIELDTERMINATOR `|`
MATCH (n:TESTPERSON {id:toInt(line.Personid)})
CASE
WHEN n.email IS NULL THEN SET n.email = [line.email]
ELSE SET n.email = n.email + line.email
但我什至不知道这是否可行,即使 CASE 错误已修复。
我真的很难过,如果有任何帮助,我将不胜感激。谢谢。
【问题讨论】:
标签: csv neo4j cypher graph-databases