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

时间:2019-02-22 04:02:01

标签: neo4j cypher

我在我的小应用程序中将neo4j用作数据库。 我的应用程序是关于管理应聘者的简历(简历)。

这是我的图:

CV Management

现在,我正在做的是添加一个项目,并列出该项目使用的技能。

这是我的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 []以确保我的技能列表为空,因为我要模拟一种情况,即没有可用的技能。

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

Neo4j result

我如何:

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

谢谢

1 个答案:

答案 0 :(得分:1)

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

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

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

要仅在USED_SKILL没有技能的情况下创建user关系,请执行以下操作:

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标签) ,这是一种使Cypher计划器生成更有效的操作的hack)。另外,我们使用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;