neo4j запрос выбора шифра в древовидном структурированном графе - PullRequest
0 голосов
/ 23 января 2020

Я новичок в neo4j и cypher и пытаюсь построить следующий запрос: Выберите узлы и отношения на картинке, которые обведены коричневым цветом (A, B, C, D, E, F, G , H и отношения), поскольку требование находится в древовидной структуре, если я сталкиваюсь с синим узлом, я должен добавить этот узел к результату, но опустить его дочерние элементы (связанные узлы). Направления отношений в данном случае не важны.

Вы можете мне помочь?

diagram1

diagram2

РЕДАКТИРОВАТЬ: И добавлен второй пример. Опять же, требуемым результатом являются узлы, окруженные коричневой линией .

Ответы [ 2 ]

1 голос
/ 23 января 2020
MATCH p=(c:LabelSystem)-[r*]->(d) 
WHERE d:LabelLeaf OR d:LabelElement 
WITH COLLECT(DISTINCT d) as labelElements,COLLECT(DISTINCT c) as labelSystem , c
MATCH (ls:LabelSystem)-[]-(le:LabelElement) 
WHERE le IN labelElements AND ls <> c
WITH COLLECT(DISTINCT ls) as  childLabelSystems,labelSystem,labelElements,c.uniqueProperty as uniqueIdentifier
WITH labelElements+childLabelSystems+labelSystem as allNodes,uniqueIdentifier
RETURN uniqueIdentifier,allNodes 

если вы используете цвет в качестве свойства внутри узла, вы можете настроить WHERE соответственно

0 голосов
/ 24 января 2020

После прочтения документации по apo c я обнаружил функцию apo c .path.expandConfig, которая почти решила мою проблему. Таким образом, решение:

  1. получить пути к узлам, которые являются Элементом или Листом
  2. получить пути к системным узлам
  3. для пути получить отношение возврата и возврата сегмента путь как: (начало) - [отношение] - (конец)
  4. объединение этих сегментов для удаления дубликатов

Это работает, и моя следующая задача - проверить производительность с большими графиками. Какие-нибудь мысли? @ Никто @ TheCrusher

match (start: System) 
where id(start)=1
call apoc.path.expandConfig(start, { labelFilter: 'Element|Leaf' }) yield path
unwind relationships(path) as x
return startnode(x) as s, x as r, endnode(x) as e
union 
match (start: System) 
where id(start)=1
call apoc.path.expandConfig(start, { labelFilter: '>System' }) yield path
unwind relationships(path) as x
return startnode(x) as s, x as r, endnode(x) as e

РЕДАКТИРОВАТЬ: Я пришел с другим запросом, который выполняет работу:

match (s: System)-[r*]-(m)
where id(s)=1 and (m:Element or m:Leaf or m:System) and not (s)-[*]-(:System)-[*]-(m)
unwind r as r1
with distinct r1 as rd
return startnode(rd), rd, endnode(rd)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...