Возвращайте только узлы с более чем одним (избыточным) путем к разным узлам в Neo4j (Cypher)

#neo4j #cypher

#neo4j #cypher

Вопрос:

Я хотел бы написать запрос, который возвращает только узлы, имеющие более одного пути к другому узлу. (показывать только избыточные пути к любому другому узлу / показывать только циклические подграфы)

Это пример из использования BloodHoundAD, который использует базу данных Neo4j.

Этот запрос, например, возвращает все пути от пользователей, которые имеют вложенную связь ‘memberOf’ с группами.

СОПОСТАВЛЕНИЕ p=(u: User)-[r:memberOf*4..8]->(g:Group) ВОЗВРАЩАЕТ p

Как я мог бы запросить это таким образом, чтобы показывать только избыточные пути?

Чтобы проиллюстрировать это, я прикрепил изображение. Здесь я хотел бы отказаться от пути, обведенного синим, и показывать только избыточные пути (обведенные красным)

График с избыточными путями, обведенный красным

Ответ №1:

Избыточные пути означают, что существует более одного пути к одному и тому же узлу, поэтому вы должны собирать пути относительно начального и конечного узлов и фильтровать, чтобы сохранить строки, в которых в списке более одного пути:

 MATCH p=(u:User)-[:MemberOf*4..8]->(g:Group) 
WITH u, g, collect(p) as paths
WHERE size(paths) > 1
RETURN u, g, paths
  

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

1. Я хотел бы добавить, что для того, чтобы заставить этот запрос функционировать в BloodHoundAD, мне пришлось использовать предложение UNWIND для преобразования списка обратно в отдельные строки, чтобы его можно было визуализировать. MATCH p=(u:User)-[:MemberOf*4..8]->(g:Group) WITH u, g, collect(p) as paths WHERE size(paths) > 1 UNWIND paths AS x RETURN x