Cypher-запрос на пути переменной длины с указанной конечной точкой - PullRequest
0 голосов
/ 23 мая 2018

Моя графовая модель содержит информацию о происхождении данных и о том, как данные перемещаются из одного столбца в другой через сопоставления столбцов в нашем инструменте ETL.Базовый шаблон с одним переходом будет выглядеть следующим образом ...

(source:Column)-[:SOURCE_OF_MAPPING]->(map:ColumnMapping)-[:TARGET_OF_MAPPING]->(target:Column)

, поэтому

  • source может быть столбцом с именем "STAGING_TABLE_1.FULL_NAME",
  • target может быть столбцом с именем «STAGING_TABLE_2.FULL_NAME», а
  • map будет тем, что было указано в запросе выбора в потоке данных инструмента ETL,Возможно, что-то вроде «UPPER (STAGING_TABLE_1.FULL_NAME || STAGING_TABLE_1.TITLE)»

Что мне нужно сделать, это сказать, если я смотрю на конкретный целевой столбец, скажем, «DATA_MART_FACT_1.FULL_NAME»", из какого столбца происходят эти данные?

Ниже приведен запрос шифрования, который я пытаюсь использовать, но он возвращает только один скачок, то есть сопоставление источника и столбца, где целью является" DATA_MART_FACT_1.FULL_NAME ".

MATCH (source:Column)-[:SOURCE_OF_MAPPING*]->(c:ColumnMapping)-[:TARGET_OF_MAPPING*]->(target:Column)
WHERE target.name = 'DATA_MART_FACT_1.FULL_NAME'
RETURN source, target, c

Я попытался удалить имена отношений и просто пометить звездочкой в ​​квадратных скобках, но это просто убивает мою установку neo4j (в настоящее время используется 5 ГБ памяти и 50% использования ЦП и зависаниеоколо 10 минут).Есть ограничения на все уникальные свойства.

Я знаю, что данные содержат то, что мне нужно, потому что в браузере neo4j я могу расширять узлы и следовать по пути, как я ожидал.Может ли кто-нибудь предоставить мне запрос шифра, который позволит мне это сделать?Возможно, моя графовая модель нуждается в небольшом рефакторинге с точки зрения имен отношений и направлений, чтобы это работало, и я очень рад это изучить.

Вот несколько цифр для генерации базового примера.

CREATE
(_0:`Column`  {`name`:"STAGING_TABLE_1.FULL_NAME"}),
(_1:`Column`  {`name`:"STAGING_TABLE_2.FULL_NAME"}),
(_2:`Column`  {`name`:"DATA_MART_FACT_1.FULL_NAME"}),
(_3:`ColumnMapping`  {`mappingText`:"UPPER(STAGING_TABLE_1.FULL_NAME)"}),
(_4:`ColumnMapping`  {`mappingText`:"LOWER(STAGING_TABLE_2.FULL_NAME)"}),
(_0)-[:`SOURCE_OF_MAPPING`]->(_3),
(_3)-[:`MAPS_TO`]->(_1),
(_1)-[:`SOURCE_OF_MAPPING`]->(_4),
(_4)-[:`MAPS_TO`]->(_2)

Тогда запрос, который я использовал, возвращает только один прыжок

MATCH (source:Column)-[:SOURCE_OF_MAPPING*..10]->(c:ColumnMapping)-[:MAPS_TO*..10]->(target:Column) WHERE target.name = 'DATA_MART_FACT_1.FULL_NAME' RETURN source, target, c

Тогда следующий вид запроса возвращает то, что мне нужно, но отсутствует связь между первыми 2 узлами.

MATCH (source:Column)-[:SOURCE_OF_MAPPING|MAPS_TO*..10]->(n)-[:MAPS_TO]->(target:Column) 
WHERE target.name = 'DATA_MART_FACT_1.FULL_NAME' 
AND (n:Column or n:ColumnMapping)
RETURN *;

Конечный результат, который я хотел бы получить, заключается в следующем (обратите внимание, псевдонимы просто включены сюда для иллюстрации потока данных, и для моих требований фактические результаты не должны быть псевдонимами) ...

(c1:Column)-[:SOURCE_OF_MAPPING]->(cm1:ColumnMapping)-[:MAPS_TO]->(c2:Column)-[:SOURCE_OF_MAPPING]->(cm2:ColumnMapping)-[:MAPS_TO]-(target:Column)

и в табличном формате источник |картографирование |цель STAGING_TABLE_1.FULL_NAME |UPPER (STAGING_TABLE_1.FULL_NAME) |STAGING_TABLE_2.FULL_NAME STAGING_TABLE_2.FULL_NAME |НИЖЕ (STAGING_TABLE_2.FULL_NAME) |DATA_MART_FACT_1.FULL_NAME

Как ни странно, когда я создал интерактивный пример (сайт может быть нестабильным и иногда может потребовать несколько обновлений, прежде чем он заработает), и хотя таблица возвращает одну строку согласноВ моей локальной установке визуальное графическое представление показывает все ожидаемые узлы и отношения.

Любой и все советы приветствуются.Заранее спасибо.

РЕДАКТИРОВАТЬ: я реорганизовал сопоставление моего столбца с целевым направлением отношений столбца, чтобы сделать ядро ​​потока естественным, как если бы это были данные, передаваемые из источника, в сопоставление столбца и в цель.Не было никаких изменений в поведении.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Для примера ниже показано, как получить начало до конца

MATCH (n)-[:SOURCE_OF_MAPPING|MAPS_TO*..4]->(target:Column) 
WHERE target.name = 'DATA_MART_FACT_1.FULL_NAME' 
AND (n:Column or n:ColumnMapping)
RETURN *;

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

0 голосов
/ 23 мая 2018

Вы можете попробовать разбить ваш запрос, используя WITH, как:

MATCH (t:Column {name:'DATA_MART_FACT_1.FULL_NAME'})-[:TARGET_OF_MAPPING*]->(c)
WITH t, c 
MATCH (c)-[:SOURCE_OF_MAPPING*]->(s)
RETURN s,t,c

Это может сократить ситуации с декартовыми продуктами.Я не пробовал в вашем случае, но в целом это хороший способ взглянуть на запросы.Кроме того, обрежьте жир по критериям - если: TARGET_OF_MAPPING подключается только к: ColumnMapping, то вам может не потребоваться указывать и проверять это.

...