合并不存在的节点并返回Neo4j中的源节点

合并不存在的节点并返回Neo4j中的源节点,neo4j,cypher,Neo4j,Cypher,我在我的小应用程序中使用neo4j作为我的数据库。 我的申请是关于管理候选人的简历 这是我的图表: 现在,我要做的是添加一个项目,其中包含项目使用的技能列表 这是我的neo4j查询: MATCH (user: User) WHERE (user.Id = "74994fd8-40bb-48e8-adf1-bc11eeb6c035") WITH user MERGE (project: Project {Id: '02d5ad72-036c-47e9-a366-d5ca4a3e66e2'}) O

我在我的小应用程序中使用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确保我的技能列表为空,因为我想模拟一种没有可用技能的情况

当我运行该命令时,我无法接收新创建的项目,即使它是在数据库中创建的。我的结果是:

我怎样才能:

  • 当技能可用时,在用户和技能之间建立关系,并且-
  • 如果没有可用的技能,请跳过此操作
  • 返回新创建的
    项目
    实例

谢谢

匹配失败的
MATCH
子句将中止查询的其余部分(查询将不返回任何结果)

以下代码段永远不会匹配任何内容,因为它试图匹配具有相关
技能
节点的
user
节点,该节点的
Id
值与不存在的值匹配(这没有意义):

要仅在
用户
没有技能时创建
已用技能
关系,请执行以下操作:

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
此查询对每个
用户
节点进行程度检查,以查找没有
关系的用户(我们故意省略模式中相对节点的
:SKILL
标签,这是一种使密码计划器生成更有效操作的黑客行为)。此外,我们使用
SET+=
而不是
SET=
,这样我们就不会替换所有节点属性,从而避免用相同的值覆盖
Id

顺便说一句:
与技能类别的关系似乎是多余的。如果一个用户的技能都可以通过
HAS_SKILL
关系获得,那么您已经可以通过以下方式获得该用户的类别:

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

我认为你的第一个要点应该是“当技能可用时,在项目和技能之间建立关系…”,对吗?谢谢你的解决方案。在回答之前,我必须在配置文件中设置neo4j的宽松匹配操作。但是,我不太喜欢触摸配置文件,如果您正在谈论OGM中的“宽松”配置设置,请参阅。有些人同意违约行为应该“更为宽松”,但出于可能的总体实际原因,已经决定不这样做。但大多数人在使用“宽大”设置时可能没有问题。
MATCH (user: User)-[:HAS_SKILL]->()-[:BE_IN_SKILL_CATEGORY]->(c)
WHERE user.Id = "74994fd8-40bb-48e8-adf1-bc11eeb6c035"
RETURN c;