#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
.