#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