Как получить узел на основе его самого верхнего родительского узла в Neo4j - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть иерархия отношений узлов, как -

Организация -> Отдел -> Система -> Функция -> Порт -> Запрос -> Ответ -> Параметр

Запрос -

   MATCH q=(p)-[*]->(b:checkoutby) WHERE p.name ="william" RETURN q

дает всю сеть, принадлежащую родительскому узлу -> william до последнего упомянутого узла -> checkoutby.

hierarchial network

Однако,

Я хочу, чтобы отображались только два связанных узла.

Я попробовал запрос -

  MATCH (n:william) WHERE n is null RETURN n UNION MATCH  n=(p)- 
   [:Parameter]->(b)  WHERE         
    b.name ="checkoutBy"   RETURN n

Но здесь эффект узла Уильям, т.е. первыйродительский узел обнуляется, и мы получаем вывод независимо от родительского узла.

Для которого я даже попробовал этот запрос -

   MATCH (n) WHERE none(node in nodes(n) WHERE node:william) RETURN n 
   UNION MATCH  n=(p)--()-[:Parameter]->(b)  WHERE b.name ="cabinet" 
   RETURN n

, но я получаю ошибку -

Neo.ClientError.Statement.SyntaxError: Несоответствие типов: ожидаемый путь, но был узел (строка 1, столбец 36 (смещение: 35)) "МАТЧ (n) ГДЕ нет (узел в узлах (n) ГДЕ узел: william)RETURN n UNION MATCH n = (p) - () - [: Parameter] -> (b) WHERE b.name = "cabinet" RETURN n "

Я даже попробовалзапрос на пересечение, но безрезультатно.

  MATCH (n1:william), (n2),(q:cabinet)
  WHERE (n1)<-[:Department]-() AND (n2)<-[:Parameter]-(q)
  RETURN count(q), collect(q.name)

Предупреждение об ошибке-

Этот запрос строит декартово произведение между несвязанными образцами.

Если часть запроса содержит несколько несвязанных шаблонов, это создаст декартово произведение между всеми этими частями.Это может привести к большому объему данных и замедлить обработку запросов.Несмотря на то, что он иногда предназначен, часто может быть возможно переформулировать запрос, избегающий использования этого перекрестного продукта, возможно, путем добавления взаимосвязи между различными частями или с помощью OPTIONAL MATCH (идентификатор: (n2))

   EXPLAIN MATCH (n1:william), (n2),(ego:cabinet)
           ^

Даже этот запрос не работает -

  MATCH (n:william)  RETURN n UNION MATCH  n=(p)-[:Parameter]->(b)  
  WHERE b.name ="checkoutBy" 
   call apoc.path.expandConfig(n, {labelFilter:'-william'}) yield path
    return path 

Пожалуйста, помогите.Я хочу получить извлекаемый / кабинетный узел, только если он находится на верхнем родительском узле - william

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Если я понял вашу проблему, у узла (b: checkoutby) нет входящих связей, поэтому вы можете написать:

MATCH (p)-[*]->(b:checkoutby) WHERE p.name ="william"  AND NOT EXISTS ( (b)-[]->()) RETURN p, b
0 голосов
/ 30 декабря 2018

У меня нет репутации, чтобы комментировать, поэтому спрашиваю здесь:

Из вашего вопроса не ясно, является ли Уильям свойством Name или меткой?

Выиспользовал его как name в первом запросе и как Label во всех других запросах.

Я предполагаю, что это Label, похоже, что этопометьте скриншот, которым вы поделились.

Если вы хотите проверить, связан ли узел checkoutby / cabinet с узлом William, и вернуть только, если он связан, вы можете использовать следующий запрос:

MATCH (w:william)-[*]-(c:checkoutby) return w,c

Обратите внимание: запросы такого типа занимают слишком много памяти.

...