【发布时间】: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 并不是一个好主意。来自docs:Neo4j 在删除节点和关系时重用其内部 id。这意味着使用和依赖内部 Neo4j id 的应用程序很脆弱或有出错的风险。因此,建议宁愿使用应用程序生成的 id。