Удаление автоморфизмов вывода запроса cypher

#neo4j #cypher #subgraph

#neo4j #cypher #подграф

Вопрос:

При выполнении запроса Cypher для извлечения определенного подграфа с автоморфизмами, скажем

 MATCH (a)-[:X]-(b)-[:X]-(c),
RETURN a, b, c
 

Похоже, что поведение по умолчанию заключается в возврате каждого извлеченного подграфа и всех их автоморфизмов.
В этом примере, если (u) -[: X] — (v) — [: X] — (w) является графом, соответствующим шаблону, выводом будут u, v,w, но также w, v, u, которые состоят из одного и того же графика.

Есть ли способ получить каждый подграф только один раз?

РЕДАКТИРОВАТЬ: было бы здорово, если бы у Cypher была функция для выполнения этого в поиске, используя какое-то условие нарушения симметрии, поскольку это сократило бы время вычислений. Если это не так, как бы вы выполнили постобработку, чтобы найти желаемый результат?

Комментарии:

1. Вы могли бы попытаться отсортировать результаты и использовать DISTINCT .

2. Было бы лучше, если бы был способ сделать это в поиске

3. В поиске? Что вы имеете в виду?

Ответ №1:

В создаваемом вами запросе (a)-[r:X]-(b) и (a)-[t:X]-(c) обратитесь к аналогичному шаблону. Поскольку (b) и (c) могут быть взаимозаменяемыми. Зачем повторять сопоставление дважды? MATCH (a)-[r:X]-(b) RETURN a, r, b возвращает все подграфы, которые вы ищете.

Редактировать

Вы можете сделать что-то следующим образом, чтобы найти узлы, которые имеют два отношения типа X .

 MATCH (a)-[r:X]-(b) WHERE size((a)-[:X]-()) = 2 RETURN a, r, b
 

Комментарии:

1. Что мне делать, если я хочу найти узлы, которые имеют два отношения X с 2 отдельными узлами?

2. @AlexisPister обновил мой ответ.

3. Спасибо, но нет ли более простого способа сделать это? Это похоже на простой шаблон, но запрос в настоящее время очень подробный

Ответ №2:

Для такого рода зеркальных шаблонов мы можем добавить ограничение на идентификаторы внутренних графов, чтобы сохранялся только один из двух путей:

 MATCH (a)-[:X]-(b)-[:X]-(c)
WHERE id(a) < id(c)
RETURN a, b, c
 

Это также предотвратит случай, когда a = c .