Neo4j为数组属性添加了唯一值

时间:2017-01-24 17:31:28

标签: neo4j cypher

我有以下代码:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1
MERGE (p:Person {forename:line1.forename, surname:line1.surname})
ON CREATE SET p.compNumber = 
CASE
WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber 
WHEN EXISTS(p.compNumber) AND line1.CompanyNumber NOT IN p.compNumber THEN p.compNumber + line1.CompanyNumber
ELSE p.compNumber
END
ON MATCH SET p.compNumber = 
CASE
WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber 
WHEN EXISTS(p.compNumber) AND line1.CompanyNumber NOT IN p.compNumber THEN p.compNumber + line1.CompanyNumber
ELSE p.compNumber
END

我要做的是将compNumber数组属性添加到Person个节点。所以,我正在检查节点中是否已存在属性compNumber,以及是否需要添加的新值尚未包含在属性中。如果该属性不存在,则使用所需的值创建它,如果存在且值不在数组中,则该值将附加到数组中。

此查询会产生错误。有谁知道我在这里做错了什么,是否有一个更漂亮的解决方案来解决我的问题?

2 个答案:

答案 0 :(得分:1)

正如我在之前的评论中所提到的,听起来您正试图在以下人员之间设置外键:人员和公司。在图形数据库中,往往不使用外键,因为节点之间的关系概念会替换它们。

我建议放弃在数组中保留companyNumbers的方法:Person节点,而在处理过程中,找到:带有该companyNumber的公司节点(如果存在)并创建:Person和:Company之间的关系

让我们假设它有一个独特的约束:公司(companyNumber)。

修改后的查询可能如下所示:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1
MERGE (p:Person {forename:line1.forename, surname:line1.surname})
MERGE (c:Company {companyNumber:line1.CompanyNumber})
MERGE (p)-[:WorksFor]->(c)

你想要改变:WorksFor到任何关系类型最有意义,因为你从未提供过关系的上下文:人员和:公司节点。

答案 1 :(得分:0)

您的line1.CompanyNumber NOT IN p.compNumber语法错误。它应该是NOT line1.CompanyNumber IN p.compNumber

此外,ON CREATE案例可以大大简化,因为在这种情况下我们知道p.comNumber不存在:

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///C:/Users/Zona/Documents/Neo4j/check/import/result1.csv' AS line1
MERGE (p:Person {forename:line1.forename, surname:line1.surname})
ON CREATE SET p.compNumber = line1.CompanyNumber
ON MATCH SET p.compNumber =
  CASE WHEN NOT EXISTS (p.compNumber) THEN line1.CompanyNumber
       WHEN EXISTS(p.compNumber) AND NOT line1.CompanyNumber IN p.compNumber THEN p.compNumber + line1.CompanyNumber
       ELSE p.compNumber END