本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
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 的限制explain
IN Neptune
Opencryppher 解释的当前版本具有以下限制:
解释计划目前仅适用于执行只读操作的查询。执行任何类型变异的查询,例如
CREATE
、DELETE
、MERGE
、SET
等等,不受支持。在 future 版本中,特定计划的运算符和输出可能会发生更改。
OpenPher 中的 DFE 运营商explain
输出
使用 OpenPher 的信息explain
功能提供,您需要了解有关如何DFE 查询引擎工作原理(DFE 是 Neptune 用来处理 OpenPher 查询的引擎)。
DFE 引擎将每个查询转换为一个运算符管道。从第一个运算符开始,中间解将从一个运算符转移到下一个运算符管道。解释表中的每一行表示一个结果,截至到评估点为止。
可以出现在 DFE 查询计划中的运算符如下:
dfeApply— 执行指定的函数functor
在参数部分中,关于存储在指定变量中的值
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
参数,在列上有或不带给定过滤器。
dfe关系加入/加入— 使用合并连接根据指定的模式键连接上一个运算符的输入。这是封锁操作。
dfe关系加入/加入— 使用合并连接根据指定的模式键连接上一个运算符的输入。这是封锁操作。
dfeSubQuery— 此运算符出现在所有计划的开头,并封装了计划中运行的部分DFE 引擎,这是 OpenPher 的整个计划。
dfeSymmetrix 哈希加入— 使用哈希连接根据指定的模式键连接上一个运算符的输入。这是一项非阻止操作。
dfeTee— 这是一个分支运营商,它将同一组解决方案发送给多个运营商。
SolutionInjection— 出现在其他所有内容之前explain
输出,中的值为 1Units Out
column. 但是,它是不可行的,并且实际上没有向 DFE 引擎注入任何解决方案。
TermResolution— 出现在计划结束时,将 Neptune 引擎中的对象转换为 OpenPher 对象。
opency Pher 中的列explain
输出
Neptune 在 OpenPher 解释输出时生成的查询计划信息包含每行一个运算符的表。该表包含以下列:
Out #1(和Out #2) — 从该运营商下游的运营商的 ID。最多可以有两个下游运营商。
Arguments (参数)— 运营商的任何相关详细信息。这包括诸如输入架构、输出架构、模式(PipelineScan
和PipelineJoin
),等等。
Mode (模式)— 描述操作员基本行为的标签。此列主要为空(-
)。一个例外是TermResolution
,模式可以在哪里id2value_opencypher
,表示从 ID 到 OpenPher 值的分辨率。
Units in Units— 作为输入传递给该运算符的解决方案的数量。没有上游运营商的运营商,例如DFEPipelineScan
、SolutionInjections
,还有DFESubquery
没有注入静态值,将有零值。
Out Units Un— 作为该操作员的输出生产的解决方案的数量。DFEDrain
是一个特殊情况,其中记录了正在耗尽的解决方案的数量Units In
和Units Out
始终为零。
时间 (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
在顶级是DFESubquery
和TermResolution
运算符。DFESubquery
封装查询执行计划中正在推送到DFE 引擎(对于 OpenPher 查询,整个查询计划由 DFE 执行)。查询计划中的所有运算符都嵌套在里面subQuery1
被引用DFESubquery
. 唯一的例外是TermResolution
,它将内部 ID 实现为完全序列化的 OpenPher 对象。
所有被推到 DFE 引擎的操作员的名字都以DFE
prefix. 如上所述,整个 OpenPher 查询计划是由 DFE 执行的,因此,除了最终的运算符以外的所有运算符TermResolution
运营商从开始DFE
.
内subQuery1
,可以有零或更多DFEChunkLocalSubQuery
要么DFELoopSubQuery
用于封装在内存限制机制中执行的推送执行计划的一部分的运算符。DFEChunkLocalSubQuery
这里包含一个SolutionInjection
它用作子查询的输入。要在输出中查找该子查询的表,请搜索subQuery=
在中指定graph URI
Arguments
对应的列DFEChunkLocalSubQuery
要么DFELoopSubQuery
运算符。
InsubQuery1
、DFEPipelineScan
和ID
0 扫描数据库中的指定pattern
. 该模式会扫描具有属性的实体code
另存为变量?n_code2
在所有标签上(你可以通过附加来筛选特定标签airport
到n:airport
)。这些区域有:inlineFilters
参数显示了code
属性等于ATL
.
下一步:DFEChunkLocalSubQuery
运算符加入包含的子查询的中间结果DFEPipelineJoin
. 这可以确保?n
实际上是一个节点,自以前DFEPipelineScan
使用code
财产。