Здесь может помочь расширитель пути из Процедуры APOC , так как мы добавили возможность выражать повторяющиеся последовательности меток, отношений или обоих.
Вв этом случае, так как вы хотите сопоставить актера шаблона, а не режиссера (или любой из фильмов в пути), нам нужно указать, какие узлы в пути вы хотите вернуть, что требует либо использования labelFilter
в дополнение к relationshipFilter
или просто для использования комбинированного свойства конфигурации sequence
, чтобы указать ожидаемые чередующиеся метки / отношения, и убедитесь, что мы используем фильтр конечных узлов на узле: Person в точке шаблона,вы хотите.
Вот как бы вы сделали это после установки APOC:
MATCH (tom:Person {name: "Tom Hanks"})
CALL apoc.path.expandConfig(tom, {sequence:'>Person, ACTED_IN>, *, <DIRECTED, *, DIRECTED>, *, <ACTED_IN', maxLevel:12}) YIELD path
WITH last(nodes(path)) as person, min(length(path)) as distance
RETURN person.name
Обычно мы будем использовать subgraphNodes()
для них, поскольку это эффективно при расширении и сокращении путей к узлам, которые мыМы уже видели, но в этом случае мы хотим сохранить возможность повторного посещения уже посещенных узлов, так как они могут возникнуть в последующих итерацияхпоэтому, чтобы получить правильный ответ, мы не можем использовать этот или любой из проков, использующих уникальность NODE_GLOBAL.
Из-за этого нам нужно остерегаться исследовать слишком много путей, как перестановки отношений кисследование того, что путь подходит, будет стремительно расти, даже после того, как мы уже нашли все возможные отдельные узлы.Чтобы избежать этого, нам нужно добавить maxLevel, поэтому в этом случае я использую 12.
Эта процедура также создаст несколько путей к одному узлу, поэтому мы собираемся получить минимумдлина всех путей к каждому узлу.
Свойство config sequence позволяет нам указать чередующиеся фильтрации меток и типов отношений для каждого шага в последовательности, начиная с начального узла.Мы используем символ фильтра конечного узла, >
перед первой меткой Person (>Person
), указывающий, что нам нужны только пути к узлу Person в этой точке последовательности (в качестве первого элемента в последовательности он также будетпоследний элемент в последовательности, как он повторяется).Мы используем подстановочный знак *
для фильтра меток всех других узлов, что означает, что узлы находятся в белом списке и будут проходить независимо от их метки, но мы не хотим возвращать пути к этим узлам.