Объединить несуществующий узел и вернуть исходный узел в Neo4j - PullRequest
0 голосов
/ 22 февраля 2019

Я использую 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 голосов
/ 23 февраля 2019

Предложение 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 генерировать более эффективную операцию).Кроме того, мы используем 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...