САЙФЕР: Невозможно исключить узлы из списка, используя ГДЕ НЕ ... В - PullRequest
0 голосов
/ 11 января 2020

У меня сейчас проблемы с тем, чтобы ГДЕ НЕ ... В ... работать. Я надеюсь получить список соседних узлов, которые имеют это отношение «пул» с дочерними узлами, не включая ни одного из исходных дочерних узлов. В настоящий момент, если я использую команду ниже, возвращенный список соседей будет содержать дочерние узлы.

MATCH (parent)-[r:Contains]-(children) WHERE parent.display_name='xyz'
WITH parent, r, children, collect(children) as child_list
OPTIONAL MATCH (children)-[:Pool]->(pool)<-[:Pool]-(neighbours) 
WHERE NOT neighbours IN child_list
RETURN child_list, collect(DISTINCT neighbours)

Альтернативный способ сделать это - просто исключить соседей, которые также непосредственно связаны с родителем. Однако это также возвращает соседей в виде списка, содержащего дочерние элементы, по-видимому, игнорируя отношение [r]. Хотя если я сделаю ГДЕ НЕ (соседи) - (родитель), это исключит детей, но за счет отношений, которые не являются [r], текущими отношениями, на которые я смотрю.

MATCH (parent)-[r:Contains]-(children) WHERE parent.display_name='xyz'
WITH parent, r, children, collect(children) as child_list
OPTIONAL MATCH (children)-[:Pool]->(pool)<-[:Pool]-(neighbours) 
WHERE NOT (neighbours)-[r]-(parent)
RETURN child_list, collect(DISTINCT neighbours)

Я был бы признателен, если бы кто-нибудь мог взглянуть на любой из вариантов и помочь мне понять, что я делаю неправильно.

Спасибо, Ник

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Это должно вернуть список дочерних элементов родительского xyz и список соседей, которые находятся в тех же «пулах», что и эти дочерние элементы.

MATCH (parent)-[:Contains]-(child) WHERE parent.display_name='xyz'
WITH COLLECT(child) as child_list
UNWIND child_list AS c
OPTIONAL MATCH (c)-[:Pool]->(pool)<-[:Pool]-(neighbor) 
WHERE NOT neighbor IN child_list
RETURN child_list, COLLECT(DISTINCT neighbor) AS neighbors
0 голосов
/ 12 января 2020

Я полагаю, что в ваших запросах агрегация работает не так, как вы ожидаете.

WITH parent, r, children, collect(children) as child_list будет возвращать строку для каждого ребенка, а не строку для родителя с набором дочерних элементов для этот родитель. Причина заключается в том, что не только parent, но также r и children считаются ключами группировки, и это сводится к уникальному ключу для каждой комбинации parent, r и children, и следовательно, разные строки (где collect(children) имеет только один элемент, дочерний элемент)

MATCH (parent)-[r:Contains]-(children) WHERE parent.display_name='xyz'
WITH parent, children
OPTIONAL MATCH (children)-[:Pool]->(pool)<-[:Pool]-(neighbours) 
WHERE NOT neighbours=children
RETURN collect(children), collect(DISTINCT neighbours)

могут быть ближе к тому, что вы ожидаете.

...