【问题标题】:Merge non-existing node and return the source node in Neo4j在 Neo4j 中合并不存在的节点并返回源节点
【发布时间】:2019-03-11 12:46:52
【问题描述】:

我在我的小应用程序中使用 neo4j 作为我的数据库。 我的申请是关于管理候选人的简历(简历)。

这是我的图表:

目前,我正在做的是添加一个项目,其中包含项目使用的技能列表。

这是我的 neo4j 查询:

MATCH (user: User)
WHERE (user.Id = "74994fd8-40bb-48e8-adf1-bc11eeb6c035")
WITH user
MERGE (project: Project {Id: '02d5ad72-036c-47e9-a366-d5ca4a3e66e2'})
ON CREATE
SET project = {
  Id: "02d5ad72-036c-47e9-a366-d5ca4a3e66e2",
  Name: "VINCI GTR",
  Description: "Description of VINCI GTR",
  StartedTime: 0.0
}
MERGE (user)-[:DID_PROJECT]->(project)
WITH project, user
MATCH (user)-[:HAS_SKILL]->(skill: Skill)
WHERE skill.Id IN []
MERGE (project)-[:USED_SKILL]->(skill)
RETURN project

在我的查询中,我使用:WHERE skill.Id IN [] 来确保我的技能列表为空,因为我想模拟没有可用技能的情况。

当我运行命令时,我无法接收新创建的项目,即使它已经在数据库中创建。我得到了这个结果:

我该怎么做:

  • 在技能可用时创建用户和技能之间的关系 -
  • 如果没有技能可用,则跳过此操作。
  • 返回新创建的Project 实例?

谢谢

【问题讨论】:

  • 我认为您的第一个要点应该是“在技能可用时创建 项目 和技能之间的关系......”,对吗?

标签: neo4j cypher


【解决方案1】:

匹配失败的MATCH 子句会中止查询的其余部分(并且查询不会返回任何内容)。

以下 sn-p 永远不会匹配任何内容,因为它试图匹配具有相关 skill 节点的 user 节点,其 Id 值匹配不存在的值(这没有意义):

MATCH (user)-[:HAS_SKILL]->(skill: Skill)
WHERE skill.Id IN []

如果user 没有技能,仅创建USED_SKILL 关系,请执行以下操作:

MATCH (user: User)
WHERE user.Id = "74994fd8-40bb-48e8-adf1-bc11eeb6c035"
MERGE (project: Project {Id: '02d5ad72-036c-47e9-a366-d5ca4a3e66e2'})
ON CREATE
  SET project += {
    Name: "VINCI GTR",
    Description: "Description of VINCI GTR",
    StartedTime: 0.0
  }
MERGE (user)-[:DID_PROJECT]->(project)
WITH project, user
WHERE SIZE((user)-[:HAS_SKILL]->()) = 0
MERGE (project)-[:USED_SKILL]->(skill)
RETURN project

此查询对每个user 节点进行度数检查,以查找没有HAS_SKILL 关系的那些(我们故意省略了模式中对面节点的:Skill 标签,这是一种hack 以使 Cypher 规划器生成更有效的操作)。此外,我们使用SET += 而不是SET =,这样我们就不会替换所有节点属性,从而避免用相同的值覆盖Id 值。

顺便说一句:

HAS_SKILL_CATEGORY 关系似乎是多余的。如果用户的技能都可以通过HAS_SKILL 关系达到,那么您已经可以通过以下方式获取该用户的类别:

MATCH (user: User)-[:HAS_SKILL]->()-[:BE_IN_SKILL_CATEGORY]->(c)
WHERE user.Id = "74994fd8-40bb-48e8-adf1-bc11eeb6c035"
RETURN c;

【讨论】:

  • 感谢您的解决方案。在你回答之前,我必须通过在配置文件中设置来打开 neo4j 的 lenient match 操作。它有效,但是,我不太喜欢触摸配置文件。
  • 如果您在谈论 OGM 中的“宽松”配置设置,请参阅this closed issue。有一些共识认为默认行为应该“更宽松”,但出于可能的整体实际原因,已决定不采用这种方式。但大多数人使用“宽松”设置可能没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-01
  • 2019-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多