【问题标题】:Updating node attributes based on new nodes基于新节点更新节点属性
【发布时间】:2019-06-12 19:10:01
【问题描述】:

我有这样的边缘:

(People)-[:USE]->(Product)
(People)-[:REVIEW]->(Product)

现在我有一个新的 csv 人员,他们是审阅者,但他们缺少我已经拥有的一些属性。

我想做这样的事情:

LOAD CSV WITH HEADERS FROM "file:///abcd.csv" AS row 
MERGE (svc:Consumer {name: row.referring_name})
ON CREATE SET
    svc.skewNum = toInteger(row.skew_num)
MERGE (p:PrimaryConsumer) WHERE p.name = svc.name
ON MATCH SET
    svc.city = p.city,
    svc.latitude = toFloat(p.latitude),
    svc.longitude = toFloat(p.longitude),
    svc.consumerId = toInteger(p.primaryConsumerId)

哪些不妥:

Neo.ClientError.Statement.SyntaxError:无效输入“H”:预期“i/I”(第 10 行,第 28 列(偏移量:346)) "合并 (p:PrimaryConsumer) WHERE p.name = svc.name"

我 100% 确信这些名称是唯一的,并且将匹配现有节点集中的唯一消费者名称(待观察)。

当唯一节点属性匹配时,如何将现有属性添加到新数据? (我希望获得唯一的 ID,但我必须能够对匹配的新数据执行更新)

谢谢。

这是整个密码脚本 -- 根据@cypher 的输入进行修改。

 USING PERIODIC COMMIT
    LOAD CSV WITH HEADERS FROM "file:///abcde.csv" AS row
    MERGE (svc:Consumer {name: row.referring_name})
    ON CREATE SET
        svc.skeyNum = toInteger(row.skew_num)
        MATCH (p:primaryConsumer {name: svc:name})
    ON MATCH SET
        svc.city = p.city,
        svc.latitude = toFloat(p.latitude),
        svc.longitude = toFloat(p.longitude),
        svc.providerId = toInteger(p.providerId)
    MERGE (spec:Product {name: row.svc_prod_name})
    ON CREATE SET
        spec.name = row.svc_prov_name,
        spec.skew = toInteger(row.skew_id),
        spec.city = row.svc_prov_city,
        spec.totalAllowed = toFloat(row.total_allowed)
    MERGE (svc)-[r:CONFIRMED_PURCHASE]->(spec)
    ON MATCH SET r.totalAllowed = r.totalAllowed + spec.totalAllowed
    ON CREATE SET r.totalAllowed = spec.totalAllowed
;

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    MERGE 不接受 WHERE 子句。

    改变这个:

    MERGE (p:PrimaryConsumer) WHERE p.name = svc.name
    

    到这里:

    MERGE (p:PrimaryConsumer {name: svc.name})
    

    [编辑]

    您的整个查询应如下所示:

    LOAD CSV WITH HEADERS FROM "file:///abcd.csv" AS row 
    MERGE (svc:Consumer {name: row.referring_name})
    ON CREATE SET
        svc.skewNum = toInteger(row.skew_num)
    MERGE (p:PrimaryConsumer {name: svc.name})
    ON MATCH SET
        svc.city = p.city,
        svc.latitude = toFloat(p.latitude),
        svc.longitude = toFloat(p.longitude),
        svc.consumerId = toInteger(p.primaryConsumerId)
    

    【讨论】:

    • 谢谢@cybersam。但我仍然在 "ON MATCH SET" 上收到错误消息。应该合并吗?
    • MERGE (p:PrimaryConsumer {name: svc.name}) ON MATCH SET ... 是合法的。你遇到了什么错误?
    • Neo.ClientError.Statement.SyntaxError: Invalid input 'N': expected 'p/P' (line 7, column 2 (offset: 259)) "ON MATCH SET"
    • 您似乎遇到了一些奇怪的问题,可能是错字。我已将完整修改后的查询添加到我的答案中。这对你有用吗?
    • MATCH 不接受 ON MATCH SET 子句。我认为您打算使用MERGE 而不是MATCH
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多