具有指定端点的可变长度路径的密码查询
Cypher query on variable length path with specified end point
我的图形模型包含有关数据沿袭以及数据如何通过我们的 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 工具数据流中 select 查询中指定的任何内容。也许像 "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 安装(目前占用 5GB 内存和 50% CPU 使用率并挂起大约 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)
那么查询我只用了return一跳
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
然后下一个查询类型 return 是我想要的但缺少前 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 |上(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
奇怪的是,当我创建一个 an interactive example(该站点可能不稳定,有时需要刷新几次才能正常工作)并且尽管 table return 的一行根据我的本地安装,可视化图形表示显示了所有预期的节点和关系。
感谢任何和所有建议。提前致谢。
编辑:我已经重构了我的列映射到目标列关系方向,使流核心自然,就好像它是数据从源流到列映射,再到目标。但是行为没有变化。
您可以尝试使用 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
这样可以减少笛卡尔积的情况。我没有尝试过你的情况,但这通常是查看查询的好方法。此外,trim 标准上的脂肪——如果 :TARGET_OF_MAPPING 仅连接到 :ColumnMapping,那么您可能不需要为此指定和测试。
例如,下面是如何从开始到结束
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 *;
我怀疑现实生活中的例子,其中可能有许多连续的列映射,结果可能必须以某种方式聚合,以避免使用开放式可变长度路径破坏性能。
我的图形模型包含有关数据沿袭以及数据如何通过我们的 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 工具数据流中 select 查询中指定的任何内容。也许像 "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 安装(目前占用 5GB 内存和 50% CPU 使用率并挂起大约 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)
那么查询我只用了return一跳
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
然后下一个查询类型 return 是我想要的但缺少前 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 |上(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
奇怪的是,当我创建一个 an interactive example(该站点可能不稳定,有时需要刷新几次才能正常工作)并且尽管 table return 的一行根据我的本地安装,可视化图形表示显示了所有预期的节点和关系。
感谢任何和所有建议。提前致谢。
编辑:我已经重构了我的列映射到目标列关系方向,使流核心自然,就好像它是数据从源流到列映射,再到目标。但是行为没有变化。
您可以尝试使用 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
这样可以减少笛卡尔积的情况。我没有尝试过你的情况,但这通常是查看查询的好方法。此外,trim 标准上的脂肪——如果 :TARGET_OF_MAPPING 仅连接到 :ColumnMapping,那么您可能不需要为此指定和测试。
例如,下面是如何从开始到结束
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 *;
我怀疑现实生活中的例子,其中可能有许多连续的列映射,结果可能必须以某种方式聚合,以避免使用开放式可变长度路径破坏性能。