我有以下代码:
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
,以及是否需要添加的新值尚未包含在属性中。如果该属性不存在,则使用所需的值创建它,如果存在且值不在数组中,则该值将附加到数组中。
此查询会产生错误。有谁知道我在这里做错了什么,是否有一个更漂亮的解决方案来解决我的问题?
答案 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