【问题标题】:GETTING Neo.ClientError.Statement.SemanticError: Cannot merge node using null property获取 Neo.ClientError.Statement.SemanticError:无法使用空属性合并节点
【发布时间】:2019-06-22 21:13:07
【问题描述】:

您好,我正在尝试在我的 csv 文件中的两列之间建立关系 我正在加载具有关系列的 csv 文件,它看起来像这样

RELATIONSHIP,AGENTID,CUSTOMERID,TXNID,TIMESTAMP,AMOUNT,CHANNEL
hasrelation,17956,2025,6C13MXSESN,2019-03-01T11:52:08,10,USSD
hasrelation,17957,2026,6C13MXSEVF,2019-03-01T11:52:09,50,BAPP

所以我想在 AGENTID 和 CUSTOMERID 之间建立关系。关系代码是

load csv with headers from "file:///test.csv" AS row
MERGE (p1:AGENTID {name: row.AGENTID})
MERGE (p2:CUSTOMERID {name: row.CUSTOMERID})
WITH p1, p2, row
CALL apoc.create.relationship(p1, row.relationship, {}, p2) YIELD rel
RETURN rel;

这是出于测试目的,但我收到以下错误 Neo.ClientError.Statement.SemanticError:无法使用名称的空属性值合并节点

而且最近我也试过这个

LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
MATCH (f:AGENTID), (s:CUSTOMERID)
WHERE f.Name = row.AGENTID
AND s.Name = row.CUSTOMERID
CALL apoc.create.relationship(f, row.RELATIONSHIP,{}, s) YIELD rel
RETURN rel

我没有在这里得到错误,但我没有得到关系结果

实际上我有一种感觉,我错过了一些非常愚蠢的点。请帮助我理解为什么我会收到这个错误。并帮助我解决这个问题。谢谢

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:

    您在第一个查询中得到SemanticError,因为您的文件中某处没有CUSTOMERIDAGENTID 的值(null),因此就像您尝试MERGE 节点上的null价值。您需要在MERGE 之前检查空值并跳过MERGE 来检查这些值。见下文。

    不建议在单个查询中使用多个MERGE在一个查询中只推荐一个MERGE

    建议您将查询分成两部分,并使用第二部分来创建关系。

    加载 AGENTID:

    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    WHERE row.AGENTID IS NOT NULL
    MERGE (p1:AGENTID {name: row.AGENTID});
    

    加载 CUSTOMERID:

    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    WHERE row.CUSTOMERID IS NOT NULL
    MERGE (p2:CUSTOMERID {name: row.CUSTOMERID})
    

    在 AGENTID 和 CUSTOMERID 之间创建关系:

    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    MATCH (f:AGENTID), (s:CUSTOMERID)
    WHERE f.name = row.AGENTID
    AND s.name = row.CUSTOMERID
    CALL apoc.create.relationship(f, row.RELATIONSHIP,{}, s) YIELD rel
    RETURN rel
    

    【讨论】:

    • 感谢@Raj 的回复。我已经单独加载了文件,MERGE 运行良好。但第三个查询不起作用。它没有给我错误,但它正在显示(没有变化,没有记录)
    • 哦,它现在工作了,我刚刚将 NAME 更改为 name :) 非常感谢。我正在向你学习一些技巧
    【解决方案2】:

    感谢 Raj 的回答。在我的情况下,直到我做了一些修改,它才起作用。这是我的新代码:

    1.加载 AGENTID:

    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    WITH row
    WHERE row.AGENTID IS NOT NULL
    MERGE (p1:AGENTID {name: row.AGENTID});
    

    2。加载 CUSTOMERID:

    USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    WITH row
    WHERE row.CUSTOMERID IS NOT NULL
    MERGE (p2:CUSTOMERID {name: row.CUSTOMERID})
    

    3.在 AGENTID 和 CUSTOMERID 之间创建关系:

    LOAD CSV WITH HEADERS FROM "file:///test.csv" AS row
    MATCH (f:AGENTID), (s:CUSTOMERID)
    WHERE f.name = row.AGENTID
    AND s.name = row.CUSTOMERID
    CALL apoc.create.relationship(f, row.RELATIONSHIP,{}, s) YIELD rel
    RETURN rel
    

    其实@Raj 已经提到here“WHERE 不能和 MERGE 一起使用。”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      相关资源
      最近更新 更多