Фильтрация значений свойства отношения в запросе перед возвратом - PullRequest
2 голосов
/ 03 апреля 2019

Я выполняю запрос, который выглядит как

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
RETURN *

Я хочу отфильтровать график, чтобы удалить все случаи, когда RELB (ребро между двумя NODEB с) не имеет определенного свойства перед возвратом.

Запрос работает, если я связываю связь с использованием [rels:RELB*] и фильтрую на rels, однако я получаю сообщение о том, что эта функция устарела и вместо нее используется WITH *, relationships(p). Конкретное сообщение

Эта функция устарела и будет удалена в следующих версиях. Связывание связей со списком в шаблоне переменной длины не рекомендуется. (Привязка шаблона отношения переменной длины к переменной ('rels') устарела и не будет поддерживаться в будущей версии. Рекомендуемый способ - привязать весь путь к переменной, а затем извлечь отношения: MATCH p = (.. .) - [...] - (...) С *, отношения (p) AS rels *

Я пробовал

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
WHERE ANY (thing IN re WHERE thing.prop = 'value')
RETURN *

Но, похоже, все равно возвращается все то же, что и в первом запросе

Я также пытался понять списки, чтобы отфильтровать отношения

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, [re in relationships(p) WHERE re.prop = 'value'] AS re
RETURN *

Но я считаю, что у этого подхода есть несколько проблем:

  1. взаимосвязи (p) представляются массивом массивов из-за характера графика
  2. существует несколько типов отношений в отношениях (p) (RELA s и RELB s), и я не уверен, как принять это во внимание

Я не могу найти в сети документацию о том, как фильтровать отношения, когда они возвращаются в виде списка (из-за * в [:RELB*])

Следует также отметить, что свойство, которое мне нужно отфильтровать RELB, является массивом, и я проверю, содержит ли оно какое-либо значение, поэтому у меня нет возможности использовать что-то вроде [:RELB*{prop: 'value'}] в запросе. (Я просто не включил это выше, чтобы не усложнять вопрос)

Любая помощь приветствуется.

1 Ответ

2 голосов
/ 03 апреля 2019

Поскольку подход rels устарел (по какой-то причине), вот более громоздкий эквивалент с использованием p = и RELATIONSHIPS(p):

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WHERE ALL(thing IN RELATIONSHIPS(p)[1..] WHERE thing.prop = 'value')
RETURN *

Кстати, если ваш запрос принимаетдолгое время и / или нехватка памяти, тогда вы можете захотеть установить разумную верхнюю границу для вашего паттерна отношения переменной длины (например, [:RELB*..6]), поскольку временные и пространственные сложности такого паттерна растут экспоненциально на глубинупоиск.

[ОРИГИНАЛЬНЫЙ ОТВЕТ]

Этот запрос использует переменную rels для хранения списка только отношений RELB:

MATCH (n:NODEA)-[:RELA]->(s:NODEB)-[rels:RELB*]->(j:NODEB)
WHERE ALL(thing IN rels WHERE thing.prop = 'value')
RETURN *

У меня естьp = удалено из шаблона, так как p в этом запросе не требуется.Если он вам нужен в вашем результате, вы можете добавить его обратно (но список rels даст вам все RELB отношения, поэтому вам может не понадобиться p).

Вам нужноиспользуйте функцию ALL() (не ANY()), если вы хотите, чтобы все отношения RELB имели желаемое значение свойства.

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