СУЩЕСТВУЕТ шифровый запрос с динамическими метками - PullRequest
1 голос
/ 09 мая 2019

Учитывая простой 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 ]

2 голосов
/ 09 мая 2019

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

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

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

Этот запрос на чистом 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...