【问题标题】:Creating Nodes and Relationships, after Matching Nodes using ID在使用 ID 匹配节点之后创建节点和关系
【发布时间】:2017-04-29 05:15:00
【问题描述】:

我有 3 种类型的节点 - Challenge、Entry 和 User,以及这些节点之间的 2 种关系:(Entry)-[POSTED_BY]->(User) 和 (Entry)-[PART_OF]->(Challenge)。

这是我想要完成的任务: - 我有一个现有的挑战,我可以通过它的 ID(内部 neo4j id)来识别它 - 我也有一个现有的用户,我可以通过它的 id 来识别它(与 neo4j 内部 id 不同) - 给定现有的 Challenge 和 User,我需要创建一个新的 Entry 节点,并通过 PART_OF 关系将其与 Challenge 节点链接。
- 另外,我需要通过POSTED_BY关系将新Entry与User节点链接起来 - 如果可能,我想在单个 Cypher 查询语句中实现上述目标

这就是我正在尝试的:

MATCH (c:Challenge) 
WHERE (id(c) = 240), 
MATCH (u:User {id: '70cf6846-b38a-413c-bab8-7c707d4f46a8'}) 
CREATE (e:Entry {name: "My Entry"})-[:PART_OF]->(c), (u)<-[r:POSTED_BY]-(e)
RETURN e;

但是,这失败了,因为我似乎无法使用上述语法匹配两个节点。但是,如果我将 Challenge 与非内部属性(例如名称)匹配,它似乎可以工作:

MATCH (c:Challenge {name: "Challenge Name"), 
MATCH (u:User {id: '70cf6846-b38a-413c-bab8-7c707d4f46a8'}) 
CREATE (e:Entry {name: "My Entry"})-[:PART_OF]->(c), (u)<-[r:POSTED_BY]-(e) 
RETURN e;

但是,正如我上面提到的,我想为挑战匹配 neo4j 内部节点 ID,我不确定除了使用 WHERE id(c) = 232 子句之外是否有其他方法可以匹配。

【问题讨论】:

  • 请注意,对于生产环境,信任 neo4j 内部 ID 并不是一个好主意。来自docsNeo4j 在删除节点和关系时重用其内部 id。这意味着使用和依赖内部 Neo4j id 的应用程序很脆弱或有出错的风险。因此,建议宁愿使用应用程序生成的 id。

标签: neo4j cypher


【解决方案1】:

您的语法几乎是正确的,但您不需要在 WHERE 和下一个 MATCH 之间使用逗号。

MATCH (c:Challenge) 
WHERE id(c) = 240
MATCH (u:User {id: '70cf6846-b38a-413c-bab8-7c707d4f46a8'}) 
CREATE (e:Entry {name: "My Entry"})-[:PART_OF]->(c), (u)<-[r:POSTED_BY]-(e) 
RETURN e;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多