Вы можете сделать необязательное совпадение, если параметр существует в neo4j cypher? - PullRequest
2 голосов
/ 13 мая 2019

Когда пользователи проходят проверку подлинности, я хочу расширить свой шифровальный запрос, чтобы указать, имеет ли пользователь отношение :LIKED к узлу элемента, и включить это в мою проекцию как логическое значение.

, еслиПользователь аутентифицирован. Я предоставлю {userId}, в противном случае параметр {userId} будет нулевым.Я исследовал WHERE и exists, но это не похоже на правильный подход.

Возможно ли это вообще в cypher в настоящее время?

РЕДАКТИРОВАТЬ:

Это представляется возможным при использовании OPTIONAL MATCH в моих первых тестах, но правильный ли это подход?

  MATCH (m:Media {mediaId: {itemId}})
  WITH m, labels(m) as labels
    OPTIONAL MATCH (m)<-[r:LIKED]-(:Person {userId: {userId}})
    RETURN m { .*, labels, liked: exists(properties(r).createdAt) } AS result
      LIMIT 1

Наконец, я могу иметьнесколько взаимосвязей, которые могут присутствовать, только если пользователь, выполняющий запрос, аутентифицирован, а параметр userId не равен NULL.

. Любые предложения или улучшения будут фантастическими для более опытных пользователей шифров.

1 Ответ

3 голосов
/ 14 мая 2019

[Изменено]

Если вам не нужно проверять наличие свойства createdAt, тогда этот еще более простой запрос будет работать:

MATCH (m:Media {mediaId: $itemId})
RETURN m { .*, labels:labels(m),
  liked: EXISTS((m)<-[:LIKED]-(:Person {userId: $userId})) } AS result;
...