我在我的小应用程序中将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
实例吗?谢谢
答案 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;