СУЩЕСТВУЕТ зашифрованный запрос с динамическими метками

Учитывая простой exists запрос как

RETURN exists( (:NodeA {propA:{0}})-[:REL_B]->(:NodeB) )

как я мог сделать метку узла NodeA быть запрошены динамически? Например

RETURN exists( (:{1} {propA:{0}})-[:REL_B]->(:NodeB) )

но это не работает Я знаю, что вы можете использовать {1} in labels(n) но как бы я использовал его в качестве предложения WHERE в шаблоне EXISTS?

2 ответа

Решение

Этот запрос чисто Cypher должен работать, но он не является производительным, поскольку он будет сканировать все узлы, чтобы найти подходящий x узел (ы) и не может воспользоваться преимуществами индексации:

MATCH (x{propA: $0})
WHERE $1 IN LABELS(x)
RETURN EXISTS((x)-[:REL_B]->(:NodeB));

Более эффективный способ сделать это - использовать процедуру APOC apoc.cypher.run для выполнения запроса Cypher с заданной жестко закодированной меткой:

CALL apoc.cypher.run(
  "RETURN EXISTS((:`" + $1 + "` {propA: $p})-[:REL_B]->(:NodeB)) AS res",
  {p: $0}) YIELD value
RETURN value.res;

Таким образом, вы также можете воспользоваться индексированием.

Нет, вы не можете использовать параметры в метках узлов. См. https://neo4j.com/docs/cypher-manual/current/syntax/parameters/ для получения подробной информации.

Параметры не могут быть использованы для следующего:

  • ключи свойств; Итак, MATCH (n) WHERE n.$param = 'что-то' недопустимо
  • типы отношений, такие как:REL_B
  • этикетки, такие как:NodeA
Другие вопросы по тегам