Фильтрация входящих узлов в Neo4J на основе свойства фильтрации узлов в восходящем направлении - PullRequest
0 голосов
/ 27 августа 2018

Во время работы над проектом линии данных rdbms я столкнулся с проблемой Neo4J Cypher, которую не могу решить:

Это пример:

  1. График состоит из узлов, представляющих базу данных таблиц (метка: TABLE ) или представлений (метка: VIEW )
  2. Таблицы или другие представления источника для представлений через направленное - [: SOURCES] -> отношение
  3. Подмножество графа имеет 10 узлов TABLE, которые при желании можно отфильтровать (исключить из графа). Они называются от А1 до А10 через свойство name. Эти узлы имеют дополнительную метку FILTERNODE
  4. Эти 10 узлов связаны с узлом ВИДА B через отношение ИСТОЧНИКОВ, пример : А1 - [: ИСТОЧНИКИ] -> B
  5. Узел B, в свою очередь, является источником VIEW узла C: B - [: SOURCES] -> C
  6. Узел C имеет свойство массива для фильтрации: C.filter = ['A2', 'A3']
  7. Узел C, в свою очередь, исходит от источника VIEW узла D: B - [: SOURCES] -> C

Теперь я хочу запросить цепочку от узлов A * к D, показывая не все узлы A *, а ТОЛЬКО те, которые отфильтрованы по свойству фильтра на узле C.

Полагаю, это нужно сделать в несколько шагов:

  1. Сначала выберите весь подграф, содержащий A1..A10, B, C, D
  2. Затем однозначно собрать все фильтрующие свойства из этого подграфа.
  3. Используйте собранные свойства фильтрации на узлах со свойством FILTERNODE, чтобы сохранить только A2, A3, B, C и D

Как мне сделать это в Cypher?

Ответы [ 2 ]

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

Вот ссылка Cypher ; Но в основном вы хотите собрать несколько массивов из свойств, объединить их в один список, а затем использовать его в качестве фильтра. Главное, что вам нужно, чтобы объединить все в один список - это EXTRACT + REDUCE с фильтром для защиты от нулевых значений (свойство не установлено).

Вот Cypher, показывающий, как сделать извлечение + уменьшение как один чистый шаг, с комментариями, поясняющими каждый шаг Cypher.

// Match our starting point, and collect all child views (0.. collects itself too)
MATCH (:TABLE)-[:SOURCES]->(start:View)-[:SOURCES*0..25]->(view:View)
// Make sure we only have one copy of each view
WITH COLLECT(DISTINCT view) as views
// Collect all filters (if they exist) into one list
WITH views, reduce(s = [], v IN [x IN views WHERE EXISTS(x.filter) | x.filter]| s + v.filter) as filters
// Match all tables in filter list
MATCH (a:TABLE)
WHERE a.name IN filters
// Format return; Everything in one column
WITH views+COLLECT(a) as ns
UNWIND ns as n
RETURN n
0 голосов
/ 29 августа 2018

Итак, вы начинаете с определенного узла C, вам нужно пройти назад и получить узлы: TABLE, которые действуют как источники, но только те, которые отфильтрованы по свойству списка в C.

Это должно работать:

MATCH (c)
WHERE id(c) = 123 // standin for however you match to your starting node
WITH c, c.filter as allowed
MATCH (a:TABLE)-[:SOURCES*]->(c)
WHERE a.name in allowed
RETURN a

Если у вас много входных узлов, а TABLE (имя) уникально, мы можем изменить это, чтобы предварительно сопоставить возможные входные узлы, что позволит нам сравнивать узлы, а не сравнивать свойства:

MATCH (c)
WHERE id(c) = 123 // standin for however you match to your starting node
MATCH (a:TABLE)
WHERE a.name in c.filter
WITH c, collect(a) as allowed
MATCH (a:TABLE)-[:SOURCES*]->(c)
WHERE a in allowed
RETURN a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...