openPherexplain功能 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

openPherexplain功能

openPherexplain功能是 Amazon Neptune 中的一种自助式工具,可帮助您了解 Neptune 引擎所采用的执行方法。要调用解释,请将参数传递到 OpenCysPherHTTPS请求explain=mode,其中,mode值可以是以下值之一:

  • static— 在static模式,explain仅打印查询计划的静态结构。它实际上不运行查询。

  • dynamic— 在dynamic模式,explain还将运行查询,并包含查询计划的动态方面。这些问题可能包括流经运算符的中间绑定的数量、传入绑定与传出绑定的比率以及每个运算符占用的总时间。

  • details— 在details模式,explain打印动态模式下显示的信息以及其他详细信息,例如实际的 OpenPher 查询字符串和连接运算符之下模式的估计范围计数。

例如,使用POST

curl HTTPS://server:port/openCypher \ -d "query=MATCH (n) RETURN n LIMIT 1;" \ -d "explain=dynamic"

或者,使用GET

curl -X GET \ "HTTPS://server:port/openCypher?query=MATCH%20(n)%20RETURN%20n%20LIMIT%201&explain=dynamic"

OpenPher 的限制explainIN Neptune

Opencryppher 解释的当前版本具有以下限制:

  • 解释计划目前仅适用于执行只读操作的查询。执行任何类型变异的查询,例如CREATEDELETEMERGESET等等,不受支持。

  • 在 future 版本中,特定计划的运算符和输出可能会发生更改。

OpenPher 中的 DFE 运营商explain输出

使用 OpenPher 的信息explain功能提供,您需要了解有关如何DFE 查询引擎工作原理(DFE 是 Neptune 用来处理 OpenPher 查询的引擎)。

DFE 引擎将每个查询转换为一个运算符管道。从第一个运算符开始,中间解将从一个运算符转移到下一个运算符管道。解释表中的每一行表示一个结果,截至到评估点为止。

可以出现在 DFE 查询计划中的运算符如下:

dfeApply— 执行指定的函数functor在参数部分中,关于存储在指定变量中的值

dfebind 关系— 将具有指定名称的变量绑定在一起

dfehunkLocal子查询— 这是一种非阻塞操作,可以用作围绕正在执行的子查询的包装器。

dFedistinct 专栏— 根据指定的变量返回输入值的不同子集。

dfeDistinct 关系— 根据指定的变量返回输入解决方案的不同子集。

dfeDRAIN— 出现在子查询的末尾,用作该子查询的终止步骤。解决方案的数量记录为Units In.Units Out始终为零。

dfeLoop 子查询— 这是一种非阻塞操作,用作子查询的包装器,允许重复运行该子查询以便在循环中使用。

dfe可选加入/加入— 执行可选联接A OPTIONAL B ≡ (A JOIN B) UNION (A MINUS_NE B). 这是封锁操作。

dfePipeline 加入— 将输入与定义的元组模式进行联接。pattern参数。

dfePipeline 扫描— 扫描数据库中的给定pattern参数,在列上有或不带给定过滤器。

dfeProject— 获取多个输入列,只投影所需的列。

dfeReduce— 对指定的变量执行指定的聚合函数。

dfe关系加入/加入— 使用合并连接根据指定的模式键连接上一个运算符的输入。这是封锁操作。

dfe关系加入/加入— 使用合并连接根据指定的模式键连接上一个运算符的输入。这是封锁操作。

dfeSubQuery— 此运算符出现在所有计划的开头,并封装了计划中运行的部分DFE 引擎,这是 OpenPher 的整个计划。

dfeSymmetrix 哈希加入— 使用哈希连接根据指定的模式键连接上一个运算符的输入。这是一项非阻止操作。

dfeTee— 这是一个分支运营商,它将同一组解决方案发送给多个运营商。

SolutionInjection— 出现在其他所有内容之前explain输出,中的值为 1Units Outcolumn. 但是,它是不可行的,并且实际上没有向 DFE 引擎注入任何解决方案。

TermResolution— 出现在计划结束时,将 Neptune 引擎中的对象转换为 OpenPher 对象。

opency Pher 中的列explain输出

Neptune 在 OpenPher 解释输出时生成的查询计划信息包含每行一个运算符的表。该表包含以下列:

ID— 计划中该运营商的数字 ID。

Out #1(和Out #2) — 从该运营商下游的运营商的 ID。最多可以有两个下游运营商。

名称— 该运营商的名字。

Arguments (参数)— 运营商的任何相关详细信息。这包括诸如输入架构、输出架构、模式(PipelineScanPipelineJoin),等等。

Mode (模式)— 描述操作员基本行为的标签。此列主要为空(-)。一个例外是TermResolution,模式可以在哪里id2value_opencypher,表示从 ID 到 OpenPher 值的分辨率。

Units in Units— 作为输入传递给该运算符的解决方案的数量。没有上游运营商的运营商,例如DFEPipelineScanSolutionInjections,还有DFESubquery没有注入静态值,将有零值。

Out Units Un— 作为该操作员的输出生产的解决方案的数量。DFEDrain是一个特殊情况,其中记录了正在耗尽的解决方案的数量Units InUnits Out始终为零。

Ratio— 的比率Units OutUnits In.

时间 (ms)— 此操作员占用的 CPU 时间,以毫秒为单位。

OpenPher 的一个基本例子说明输出

以下是 OpenPher 的基本示例。explain输出。查询是在航空航线数据集中查找具有机场代码的节点的单节点ATL调用explain使用details默认 ASCII 输出格式下的模式:

curl -d "query=MATCH (n {code: 'ATL'}) RETURN n" -k https://localhost:8182/openCypher -d "explain=details" ~ Query: MATCH (n {code: 'ATL'}) RETURN n ╔════╤════════╤════════╤═══════════════════╤════════════════════╤═════════════════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════╪════════════════════╪═════════════════════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ SolutionInjection │ solutions=[{}] │ - │ 0 │ 1 │ 0.00 │ 0 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFESubquery │ subQuery=subQuery1 │ - │ 0 │ 1 │ 0.00 │ 4.00 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ - │ - │ TermResolution │ vars=[?n] │ id2value_opencypher │ 1 │ 1 │ 1.00 │ 2.00 ║ ╚════╧════════╧════════╧═══════════════════╧════════════════════╧═════════════════════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery1 ╔════╤════════╤════════╤═══════════════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════════╪══════════════════════════════════════════════════════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFEPipelineScan │ pattern=Node(?n) with property 'code' as ?n_code2 and label 'ALL' │ - │ 0 │ 1 │ 0.00 │ 0.21 ║ ║ │ │ │ │ inlineFilters=[(?n_code2 IN ["ATL"^^xsd:string])] │ │ │ │ │ ║ ║ │ │ │ │ patternEstimate=1 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFEChunkLocalSubQuery │ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ DFEProject │ columns=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.03 ║ ╚════╧════════╧════════╧═══════════════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 ╔════╤════════╤════════╤══════════════════════╤════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪══════════════════════╪════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFESolutionInjection │ outSchema=[?n, ?n_code2] │ - │ 0 │ 1 │ 0.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ 3 │ DFETee │ - │ - │ 1 │ 2 │ 2.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 4 │ - │ DFEDistinctColumn │ column=?n │ - │ 1 │ 1 │ 1.00 │ 0.20 ║ ║ │ │ │ │ ordered=false │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 5 │ - │ DFEHashIndexBuild │ vars=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ 5 │ - │ DFEPipelineJoin │ pattern=Node(?n) with property 'ALL' and label '?n_label1' │ - │ 1 │ 1 │ 1.00 │ 0.25 ║ ║ │ │ │ │ patternEstimate=3506 │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 5 │ 6 │ 7 │ DFESync │ - │ - │ 2 │ 2 │ 1.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 6 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 7 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 8 │ 9 │ - │ DFEHashIndexJoin │ - │ - │ 2 │ 1 │ 0.50 │ 0.35 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 9 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.02 ║ ╚════╧════════╧════════╧══════════════════════╧════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝

在顶级,SolutionInjection出现在其他一切之前,有 1 个单位出来。请注意,它实际上没有注入任何解决方案。你可以看到下一个操作员DFESubquery,中有 0 个单位。

晚于SolutionInjection在顶级是DFESubqueryTermResolution运算符。DFESubquery封装查询执行计划中正在推送到DFE 引擎(对于 OpenPher 查询,整个查询计划由 DFE 执行)。查询计划中的所有运算符都嵌套在里面subQuery1被引用DFESubquery. 唯一的例外是TermResolution,它将内部 ID 实现为完全序列化的 OpenPher 对象。

所有被推到 DFE 引擎的操作员的名字都以DFEprefix. 如上所述,整个 OpenPher 查询计划是由 DFE 执行的,因此,除了最终的运算符以外的所有运算符TermResolution运营商从开始DFE.

subQuery1,可以有零或更多DFEChunkLocalSubQuery要么DFELoopSubQuery用于封装在内存限制机制中执行的推送执行计划的一部分的运算符。DFEChunkLocalSubQuery这里包含一个SolutionInjection它用作子查询的输入。要在输出中查找该子查询的表,请搜索subQuery=graph URI在中指定Arguments对应的列DFEChunkLocalSubQuery要么DFELoopSubQuery运算符。

InsubQuery1DFEPipelineScanID0 扫描数据库中的指定pattern. 该模式会扫描具有属性的实体code另存为变量?n_code2在所有标签上(你可以通过附加来筛选特定标签airportn:airport)。这些区域有:inlineFilters参数显示了code属性等于ATL.

下一步:DFEChunkLocalSubQuery运算符加入包含的子查询的中间结果DFEPipelineJoin. 这可以确保?n实际上是一个节点,自以前DFEPipelineScan使用code财产。