Cypher: избегайте дублирования узлов

Имейте следующие отношения

Bob-[:TWINS]-Alice

Мне нужно вернуть всех близнецов. Ниже приведен используемый шифр, но он возвращает дубликаты.

MATCH a-[:TWINS]-b 
RETURN a.name, b.name

Я настроил это в консоли Neo4j здесь.

Как не вернуть дубликаты? Я знаю, что это можно легко исправить, включив направление отношения, но здесь направление не имеет значения. Поэтому интересно, как избежать дубликатов.


person Aravind Yarram    schedule 16.09.2013    source источник


Ответы (4)


Это классический способ:

MATCH a-[:TWINS]-b
WHERE id(a) < id(b)
RETURN a, b
person Eve Freeman    schedule 17.09.2013

Попробуйте это, сначала упорядочите пару имен, а затем используйте «DISTINCT», чтобы удалить дубликаты.

MATCH a-[:TWINS]-b 
RETURN DISTINCT CASE WHEN a.name < b.name  THEN a.name + ',' + b.name  ELSE b.name + ',' + a.name END AS result
person Lisa Li    schedule 17.09.2013

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

Идея состоит в том, чтобы устранить дубликаты, используя DISTINCT для отношения, а затем использовать функции startnode и endnode для извлечения узлов для каждого идентифицированного отношения.

MATCH p=a-[r:TWINS]-b 
WITH DISTINCT r AS rel 
WITH startnode(rel) AS n1, endnode(rel) AS n2 
RETURN n1.name, n2.name
person Aravind Yarram    schedule 16.09.2013
comment
почему бы просто не вернуть разные a.name, b.name? - person Lisa Li; 17.09.2013
comment
@Lisa Пробовала MATCH p=a-[r:TWINS]-b RETURN DISTINCT a.name, b.name Это не работает. - person Aravind Yarram; 17.09.2013
comment
Да, ты прав. Я опубликовал другое решение, которое упорядочивает имена перед использованием DISTINCT. - person Lisa Li; 17.09.2013

Отношения являются направленными, и вы используете форму запроса, которая игнорирует направление. Поскольку кажется, что вы структурировали свои данные таким образом, что между близнецами существует одна связь, вы можете заставить их возвращать одиночную связь между близнецами, ограничив свой запрос одним направлением: обратите внимание на дополнительный символ > в запросе, который затем требует, чтобы отношение было в этом направлении для совпадения.

MATCH a-[:TWINS]->b 
RETURN a.name, b.name
person Edward    schedule 16.09.2013