#neo4j #cypher #spring-data-neo4j #neo4j-apoc
#neo4j #шифр #spring-data-neo4j #neo4j-apoc
Вопрос:
Мой график представляет собой ориентированный ациклический граф. Я хотел бы запросить подграф данного родительского узла, но затем отфильтровать подграфы, которые имеют отношение к другому родительскому узлу. Я создал изображение для иллюстрации.
Например, я хотел бы выбрать подграф (C)-[r]->(D)
, но исключить (B)-[r]->(E)
, потому что он является дочерним элементом (A)
.
Я написал следующий запрос Cypher, который включает в себя вызов apoc.path.subpgrahAll()
, он отфильтровывает (B), но он не отфильтровывает такие узлы, как (E)
MATCH (n {id: 'C'})
CALL apoc.path.subgraphAll(n, {relationshipFilter: 'CONNECTED>'})
YIELD nodes, relationships
UNWIND nodes as node
WITH node
WHERE SIZE(()-[:CONNECTED]->(node)) = 1
RETURN node
Комментарии:
1. Итак, вы действительно хотите отфильтровать узлы, которые имеют отношение к любому родительскому узлу (а не просто «другому родительскому узлу»), правильно? Кроме того, как мы можем определить, что узел является «родительским» узлом, который будет использоваться для целей фильтрации?
2. Не совсем то, о чем я думал, в этом примере я хотел бы выбрать C и D в качестве подграфа, начиная с C, B следует исключить, поскольку у него есть другой родительский узел, кроме C; A. Родительские узлы имеют исходящую связь с дочерним узлом .. обратитесь к чертежу.
3. ОК. Формулировка может быть интерпретирована несколькими способами, и я выбрал «неправильный» :-).
4. Чтобы соответствовать вашей диаграмме, не следует ли в вашем
MATCH
предложении указывать «A» вместо «C»?5. Не совсем, потому что диаграмма — это весь график, все. Я просто пытаюсь выбрать подграф, начинающийся с C. A существует только для обозначения того, что у B есть другой родитель.
Ответ №1:
Это может сработать для вас:
CALL apoc.path.subgraphAll(n, {relationshipFilter: 'CONNECTED>'}) YIELD nodes, relationships
UNWIND nodes as node
WITH node
WHERE SIZE((node)<-[:CONNECTED]-()) = 1
RETURN node
Кстати, в шаблонах Cypher перед типом отношения нужно ставить двоеточие, что было одной из проблем (но не главной) с вашим запросом.
Комментарии:
1. Это решение близко, но если я использую это на примере с большим количеством узлов, оно не выполняется, потому что оно включает конечные узлы узлов, которые имеют несколько родительских. Я собираюсь обновить свой вопрос, чтобы отразить это. Спасибо.
2. Возможно ли, чтобы какие-либо узлы в одном из ваших подграфов имели входящие
CONNECTED
связи извне этого подграфа?3. Да, в этом случае я бы хотел исключить эти узлы.