СУЩЕСТВУЕТ зашифрованный запрос с динамическими метками
Учитывая простой 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