在 Neptune 中调用 SPARQL explain 的示例 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在 Neptune 中调用 SPARQL explain 的示例

本部分中的示例显示了您通过在 Amazon Neptune 中调用 SPARQL explain 特征来分析查询执行可生成的各种输出。

了解 Explain 输出

在此示例中,Jane Doe 认识两个人,即 John Doe 和 Richard Roe:

@prefix ex: <http://example.com> . @prefix foaf: <http://xmlns.com/foaf/0.1/> . ex:JaneDoe foaf:knows ex:JohnDoe . ex:JohnDoe foaf:firstName "John" . ex:JohnDoe foaf:lastName "Doe" . ex:JaneDoe foaf:knows ex:RichardRoe . ex:RichardRoe foaf:firstName "Richard" . ex:RichardRoe foaf:lastName "Roe" . .

要确定 Jane Doe 认识的所有人员的名字,您可以编写以下查询:

curl http(s)://your_server:your_port/sparql \ -d "query=PREFIX foaf: <https://xmlns.com/foaf/0.1/> PREFIX ex: <https://www.example.com/> \ SELECT ?firstName WHERE { ex:JaneDoe foaf:knows ?person . ?person foaf:firstName ?firstName }" \ -H "Accept: text/csv"

此简单查询将返回以下内容:

firstName John Richard

接下来,更改 curl 命令以调用 explain,方式是添加 -d "explain=dynamic" 并使用默认输出类型而不是 text/csv

curl http(s)://your_server:your_port/sparql \ -d "query=PREFIX foaf: <https://xmlns.com/foaf/0.1/> PREFIX ex: <https://www.example.com/> \ SELECT ?firstName WHERE { ex:JaneDoe foaf:knows ?person . ?person foaf:firstName ?firstName }" \ -d "explain=dynamic"

查询现在将返回采用美观的 ASCII 格式(HTTP 内容类型 text/plain)的输出,这是默认输出类型:

╔════╤════════╤════════╤═══════════════════╤═══════════════════════════════════════════════════════╤══════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ 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 │ - │ PipelineJoin │ pattern=distinct(ex:JaneDoe, foaf:knows, ?person) │ - │ 1 │ 2 │ 2.00 │ 1 ║ ║ │ │ │ │ joinType=join │ │ │ │ │ ║ ║ │ │ │ │ joinProjectionVars=[?person] │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ PipelineJoin │ pattern=distinct(?person, foaf:firstName, ?firstName) │ - │ 2 │ 2 │ 1.00 │ 1 ║ ║ │ │ │ │ joinType=join │ │ │ │ │ ║ ║ │ │ │ │ joinProjectionVars=[?person, ?firstName] │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 4 │ - │ Projection │ vars=[?firstName] │ retain │ 2 │ 2 │ 1.00 │ 0 ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ - │ - │ TermResolution │ vars=[?firstName] │ id2value │ 2 │ 2 │ 1.00 │ 1 ║ ╚════╧════════╧════════╧═══════════════════╧═══════════════════════════════════════════════════════╧══════════╧══════════╧═══════════╧═══════╧═══════════╝

有关 Name 列中的操作及其参数的详细信息,请参阅 explain 运算符

下面对输出进行了逐行介绍:

  1. 主查询中的第一步始终使用 SolutionInjection 运算符来注入解。然后,注入的解将通过计算过程扩展到最终结果。

    在这种情况下,它会注入所谓的通用解 { }。在存在 VALUES 子句或 BIND 的情况下,此步骤还可能注入更复杂的变量绑定来开始计算。

    Units Out 列指示此单一解流出运算符。Out #1 列指定此运算符将结果注入到的运算符。在本示例中,所有运算符均连接到表中的下一个运算符。

  2. 第二步是 PipelineJoin。它将接收作为上一个运算符 (Units In := 1) 生成的单一通用(完全不受约束的)解。它将它与 pattern 参数定义的三元组模式进行联接。这对应于该模式的简单查找。在这种情况下,三元组模式将定义为以下内容:

    distinct( ex:JaneDoe, foaf:knows, ?person )

    joinType := join 参数表示这是一个常规联接(其他类型包括 optional 联接、existence check 联接等)。

    distinct := true 参数表示您仅从数据库中提取不同的匹配(无重复),并且您将不同的匹配绑定到变量 joinProjectionVars := ?person(重复)。

    事实上,Units Out 列值为 2,表示有两个解流出。具体来说,这些是 ?person 变量的绑定,从而向这两位人员反映该数据显示 Jane Doe 知道:

    ?person ------------- ex:JohnDoe ex:RichardRoe
  3. 阶段 2 中的两个解作为输入 (Units In := 2) 流入第二个 PipelineJoin。此运算符将两个之前的解与以下三元组模式联接:

    distinct(?person, foaf:firstName, ?firstName)

    已知 ?person 变量要由运算符的传入解绑定到 ex:JohnDoeex:RichardRoe。假定 PipelineJoin 提取名字 John 和 Richard。然后,两个传出解 (Units Out := 2) 如下所示:

    ?person | ?firstName --------------------------- ex:JohnDoe | John ex:RichardRoe | Richard
  4. 下一个投影运算符将阶段 3 中的两个解 (Units In := 2) 作为输入并投影于 ?firstName 变量上。这将消除映射中的所有其他变量绑定并传递两个绑定 (Units Out := 2):

    ?firstName ---------- John Richard
  5. 为了提高性能,在可能的情况下,Neptune 会针对其分配到一些术语(如 URI 和字符串文本)的内部标识符运算,而不是针对字符串本身运算。最后一个运算符 TermResolution 执行从这些内部标识符映射回相应词语字符串的工作。

    在常规(非解释)查询评估中,最后一个运算符计算的结果随后会序列化为请求的序列化格式,并流式传输到客户端。

详细信息模式输出示例

注意

SPARQL explain 详细信息模式从 Neptune 引擎版本 1.0.2.1 开始推出。

假设您在详细信息 模式而不是动态 模式下运行与前面相同的查询:

curl http(s)://your_server:your_port/sparql \ -d "query=PREFIX foaf: <https://xmlns.com/foaf/0.1/> PREFIX ex: <https://www.example.com/> \ SELECT ?firstName WHERE { ex:JaneDoe foaf:knows ?person . ?person foaf:firstName ?firstName }" \ -d "explain=details"

如此示例所示,输出相同,但有一些额外的详细信息,例如位于输出顶部的查询字符串,以及 PipelineJoin 运算符的 patternEstimate 计数:

Query: PREFIX foaf: <https://xmlns.com/foaf/0.1/> PREFIX ex: <https://www.example.com/> SELECT ?firstName WHERE { ex:JaneDoe foaf:knows ?person . ?person foaf:firstName ?firstName } ╔════╤════════╤════════╤═══════════════════╤═══════════════════════════════════════════════════════╤══════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ 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 │ - │ PipelineJoin │ pattern=distinct(ex:JaneDoe, foaf:knows, ?person) │ - │ 1 │ 2 │ 2.00 │ 13 ║ ║ │ │ │ │ joinType=join │ │ │ │ │ ║ ║ │ │ │ │ joinProjectionVars=[?person] │ │ │ │ │ ║ ║ │ │ │ │ patternEstimate=2 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ PipelineJoin │ pattern=distinct(?person, foaf:firstName, ?firstName) │ - │ 2 │ 2 │ 1.00 │ 3 ║ ║ │ │ │ │ joinType=join │ │ │ │ │ ║ ║ │ │ │ │ joinProjectionVars=[?person, ?firstName] │ │ │ │ │ ║ ║ │ │ │ │ patternEstimate=2 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 4 │ - │ Projection │ vars=[?firstName] │ retain │ 2 │ 2 │ 1.00 │ 1 ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ - │ - │ TermResolution │ vars=[?firstName] │ id2value │ 2 │ 2 │ 1.00 │ 7 ║ ╚════╧════════╧════════╧═══════════════════╧═══════════════════════════════════════════════════════╧══════════╧══════════╧═══════════╧═══════╧═══════════╝

静态模式输出的示例

假设您在静态 模式(默认)而不是详细信息 模式下运行与上一个查询相同的查询:

curl http(s)://your_server:your_port/sparql \ -d "query=PREFIX foaf: <https://xmlns.com/foaf/0.1/> PREFIX ex: <https://www.example.com/> \ SELECT ?firstName WHERE { ex:JaneDoe foaf:knows ?person . ?person foaf:firstName ?firstName }" \ -d "explain=static"

如本示例所示,输出是相同的,但它省略了最后三个列:

╔════╤════════╤════════╤═══════════════════╤═══════════════════════════════════════════════════════╤══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode ║ ╠════╪════════╪════════╪═══════════════════╪═══════════════════════════════════════════════════════╪══════════╣ ║ 0 │ 1 │ - │ SolutionInjection │ solutions=[{}] │ - ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────╢ ║ 1 │ 2 │ - │ PipelineJoin │ pattern=distinct(ex:JaneDoe, foaf:knows, ?person) │ - ║ ║ │ │ │ │ joinType=join │ ║ ║ │ │ │ │ joinProjectionVars=[?person] │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────╢ ║ 2 │ 3 │ - │ PipelineJoin │ pattern=distinct(?person, foaf:firstName, ?firstName) │ - ║ ║ │ │ │ │ joinType=join │ ║ ║ │ │ │ │ joinProjectionVars=[?person, ?firstName] │ ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────╢ ║ 3 │ 4 │ - │ Projection │ vars=[?firstName] │ retain ║ ╟────┼────────┼────────┼───────────────────┼───────────────────────────────────────────────────────┼──────────╢ ║ 4 │ - │ - │ TermResolution │ vars=[?firstName] │ id2value ║ ╚════╧════════╧════════╧═══════════════════╧═══════════════════════════════════════════════════════╧══════════╝

为参数编码的不同方式

以下示例查询说明了调用 SPARQL explain 时编码参数的两种不同方式。

使用 URL 编码 - 此示例使用参数的 URL 编码并指定动态 输出:

curl -XGET "http(s)://your_server:your_port/sparql?query=SELECT%20*%20WHERE%20%7B%20%3Fs%20%3Fp%20%3Fo%20%7D%20LIMIT%20%31&explain=dynamic"

直接指定参数 - 这与上一个查询相同,但它是通过 POST 直接传递参数:

curl http(s)://your_server:your_port/sparql \ -d "query=SELECT * WHERE { ?s ?p ?o } LIMIT 1" \ -d "explain=dynamic"

text/plain 以外的其它输出类型

前面的示例使用默认 text/plain 输出类型。Neptune 还可以将 SPARQL explain 输出格式化为另外两种 MIME 类型的格式,即 text/csvtext/html。通过设置 HTTP Accept 标头(可使用 curl 中的 -H 标记来实现)调用它们,如下所示:

-H "Accept: output type"

下面是一些示例:

text/csv 输出

此查询通过指定 -H "Accept: text/csv" 调用 CSV MIME 类型输出:

curl http(s)://your_server:your_port/sparql \ -d "query=SELECT * WHERE { ?s ?p ?o } LIMIT 1" \ -d "explain=dynamic" \ -H "Accept: text/csv"

方便导入到电子表格或数据库中的 CSV 格式使用分号 ( ; ) 分隔每个 explain 行中的字段,如下所示:

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;-;PipelineJoin;pattern=distinct(?s, ?p, ?o),joinType=join,joinProjectionVars=[?s, ?p, ?o];-;1;6;6.00;1 2;3;-;Projection;vars=[?s, ?p, ?o];retain;6;6;1.00;2 3;-;-;Slice;limit=1;-;1;1;1.00;1

 

text/html 输出

如果您指定 -H "Accept: text/html",则 explain 将生成 HTML 表:

<!DOCTYPE html> <html> <body> <table border="1px"> <thead> <tr> <th>ID</th> <th>Out #1</th> <th>Out #2</th> <th>Name</th> <th>Arguments</th> <th>Mode</th> <th>Units In</th> <th>Units Out</th> <th>Ratio</th> <th>Time (ms)</th> </tr> </thead> <tbody> <tr> <td>0</td> <td>1</td> <td>-</td> <td>SolutionInjection</td> <td>solutions=[{}]</td> <td>-</td> <td>0</td> <td>1</td> <td>0.00</td> <td>0</td> </tr> <tr> <td>1</td> <td>2</td> <td>-</td> <td>PipelineJoin</td> <td>pattern=distinct(?s, ?p, ?o)<br> joinType=join<br> joinProjectionVars=[?s, ?p, ?o]</td> <td>-</td> <td>1</td> <td>6</td> <td>6.00</td> <td>1</td> </tr> <tr> <td>2</td> <td>3</td> <td>-</td> <td>Projection</td> <td>vars=[?s, ?p, ?o]</td> <td>retain</td> <td>6</td> <td>6</td> <td>1.00</td> <td>2</td> </tr> <tr> <td>3</td> <td>-</td> <td>-</td> <td>Slice</td> <td>limit=1</td> <td>-</td> <td>1</td> <td>1</td> <td>1.00</td> <td>1</td> </tr> </tbody> </table> </body> </html>

HTML 在浏览器中呈现如下所示的内容:

SPARQL Explain HTML 输出的示例。

启用 DFE 时的 SPARQL explain 输出示例

以下是启用 Neptune DFE 替代查询引擎时的 SPARQL explain 输出的示例:

╔════╤════════╤════════╤═══════════════════╤═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╤══════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ 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 │ - │ HashIndexBuild │ solutionSet=solutionSet1 │ - │ 1 │ 1 │ 1.00 │ 22 ║ ║ │ │ │ │ joinVars=[] │ │ │ │ │ ║ ║ │ │ │ │ sourceType=pipeline │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ DFENode │ DFE Stats= │ - │ 101 │ 100 │ 0.99 │ 32 ║ ║ │ │ │ │ ====> DFE execution time (measured by DFEQueryEngine) │ │ │ │ │ ║ ║ │ │ │ │ accepted [micros]=127 │ │ │ │ │ ║ ║ │ │ │ │ ready [micros]=2 │ │ │ │ │ ║ ║ │ │ │ │ running [micros]=5627 │ │ │ │ │ ║ ║ │ │ │ │ finished [micros]=0 │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ ===> DFE execution time (measured in DFENode) │ │ │ │ │ ║ ║ │ │ │ │ -> setupTime [ms]=1 │ │ │ │ │ ║ ║ │ │ │ │ -> executionTime [ms]=14 │ │ │ │ │ ║ ║ │ │ │ │ -> resultReadTime [ms]=0 │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ ===> Static analysis statistics │ │ │ │ │ ║ ║ │ │ │ │ --> 35907 micros spent in parser. │ │ │ │ │ ║ ║ │ │ │ │ --> 7643 micros spent in range count estimation │ │ │ │ │ ║ ║ │ │ │ │ --> 2895 micros spent in value resolution │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ --> 39974925 micros spent in optimizer loop │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ DFEJoinGroupNode[ children={ │ │ │ │ │ ║ ║ │ │ │ │ DFEPatternNode[(?1, TERM[117442062], ?2, ?3) . project DISTINCT[?1, ?2] {rangeCountEstimate=100}, │ │ │ │ │ ║ ║ │ │ │ │ OperatorInfoWithAlternative[ │ │ │ │ │ ║ ║ │ │ │ │ rec=OperatorInfo[ │ │ │ │ │ ║ ║ │ │ │ │ type=INCREMENTAL_PIPELINE_JOIN, │ │ │ │ │ ║ ║ │ │ │ │ costEstimates=OperatorCostEstimates[ │ │ │ │ │ ║ ║ │ │ │ │ costEstimate=OperatorCostEstimate[in=1.0000,out=100.0000,io=0.0002,comp=0.0000,mem=0], │ │ │ │ │ ║ ║ │ │ │ │ worstCaseCostEstimate=OperatorCostEstimate[in=1.0000,out=100.0000,io=0.0002,comp=0.0000,mem=0]]], │ │ │ │ │ ║ ║ │ │ │ │ alt=OperatorInfo[ │ │ │ │ │ ║ ║ │ │ │ │ type=INCREMENTAL_HASH_JOIN, │ │ │ │ │ ║ ║ │ │ │ │ costEstimates=OperatorCostEstimates[ │ │ │ │ │ ║ ║ │ │ │ │ costEstimate=OperatorCostEstimate[in=1.0000,out=100.0000,io=0.0003,comp=0.0000,mem=3212], │ │ │ │ │ ║ ║ │ │ │ │ worstCaseCostEstimate=OperatorCostEstimate[in=1.0000,out=100.0000,io=0.0003,comp=0.0000,mem=3212]]]]], │ │ │ │ │ ║ ║ │ │ │ │ DFEPatternNode[(?1, TERM[150997262], ?4, ?5) . project DISTINCT[?1, ?4] {rangeCountEstimate=100}, │ │ │ │ │ ║ ║ │ │ │ │ OperatorInfoWithAlternative[ │ │ │ │ │ ║ ║ │ │ │ │ rec=OperatorInfo[ │ │ │ │ │ ║ ║ │ │ │ │ type=INCREMENTAL_HASH_JOIN, │ │ │ │ │ ║ ║ │ │ │ │ costEstimates=OperatorCostEstimates[ │ │ │ │ │ ║ ║ │ │ │ │ costEstimate=OperatorCostEstimate[in=100.0000,out=100.0000,io=0.0003,comp=0.0000,mem=6400], │ │ │ │ │ ║ ║ │ │ │ │ worstCaseCostEstimate=OperatorCostEstimate[in=100.0000,out=100.0000,io=0.0003,comp=0.0000,mem=6400]]], │ │ │ │ │ ║ ║ │ │ │ │ alt=OperatorInfo[ │ │ │ │ │ ║ ║ │ │ │ │ type=INCREMENTAL_PIPELINE_JOIN, │ │ │ │ │ ║ ║ │ │ │ │ costEstimates=OperatorCostEstimates[ │ │ │ │ │ ║ ║ │ │ │ │ costEstimate=OperatorCostEstimate[in=100.0000,out=100.0000,io=0.0010,comp=0.0000,mem=0], │ │ │ │ │ ║ ║ │ │ │ │ worstCaseCostEstimate=OperatorCostEstimate[in=100.0000,out=100.0000,io=0.0010,comp=0.0000,mem=0]]]]] │ │ │ │ │ ║ ║ │ │ │ │ }, │ │ │ │ │ ║ ║ │ │ │ │ ] │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ ===> DFE configuration: │ │ │ │ │ ║ ║ │ │ │ │ solutionChunkSize=5000 │ │ │ │ │ ║ ║ │ │ │ │ ouputQueueSize=20 │ │ │ │ │ ║ ║ │ │ │ │ numComputeCores=3 │ │ │ │ │ ║ ║ │ │ │ │ maxParallelIO=10 │ │ │ │ │ ║ ║ │ │ │ │ numInitialPermits=12 │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ ====> DFE configuration (reported back) │ │ │ │ │ ║ ║ │ │ │ │ numComputeCores=3 │ │ │ │ │ ║ ║ │ │ │ │ maxParallelIO=2 │ │ │ │ │ ║ ║ │ │ │ │ numInitialPermits=12 │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ ===> Statistics & operator histogram │ │ │ │ │ ║ ║ │ │ │ │ ==> Statistics │ │ │ │ │ ║ ║ │ │ │ │ -> 3741 / 3668 micros total elapsed (incl. wait / excl. wait) │ │ │ │ │ ║ ║ │ │ │ │ -> 3741 / 3 millis total elapse (incl. wait / excl. wait) │ │ │ │ │ ║ ║ │ │ │ │ -> 3741 / 0 secs total elapsed (incl. wait / excl. wait) │ │ │ │ │ ║ ║ │ │ │ │ ==> Operator histogram │ │ │ │ │ ║ ║ │ │ │ │ -> 47.66% of total time (excl. wait): pipelineScan (2 instances) │ │ │ │ │ ║ ║ │ │ │ │ -> 10.99% of total time (excl. wait): merge (1 instances) │ │ │ │ │ ║ ║ │ │ │ │ -> 41.17% of total time (excl. wait): symmetricHashJoin (1 instances) │ │ │ │ │ ║ ║ │ │ │ │ -> 0.19% of total time (excl. wait): drain (1 instances) │ │ │ │ │ ║ ║ │ │ │ │ │ │ │ │ │ ║ ║ │ │ │ │ nodeId | out0 | out1 | opName | args | rowsIn | rowsOut | chunksIn | chunksOut | elapsed* | outWait | outBlocked | ratio | rate* [M/s] | rate [M/s] | % │ │ │ │ │ ║ ║ │ │ │ │ ------ | ------ | ---- | ----------------- | ------------------------------------------------ | ------ | ------- | -------- | --------- | -------- | ------- | ---------- | -------- | ----------- | ---------- | ----- │ │ │ │ │ ║ ║ │ │ │ │ node_0 | node_2 | - | pipelineScan | (?1, TERM[117442062], ?2, ?3) DISTINCT [?1, ?2] | 0 | 100 | 0 | 1 | 874 | 0 | 0 | Infinity | 0.1144 | 0.1144 | 23.83 │ │ │ │ │ ║ ║ │ │ │ │ node_1 | node_2 | - | pipelineScan | (?1, TERM[150997262], ?4, ?5) DISTINCT [?1, ?4] | 0 | 100 | 0 | 1 | 874 | 0 | 0 | Infinity | 0.1144 | 0.1144 | 23.83 │ │ │ │ │ ║ ║ │ │ │ │ node_2 | node_4 | - | symmetricHashJoin | | 200 | 100 | 2 | 2 | 1510 | 73 | 0 | 0.50 | 0.0662 | 0.0632 | 41.17 │ │ │ │ │ ║ ║ │ │ │ │ node_3 | - | - | drain | | 100 | 0 | 1 | 0 | 7 | 0 | 0 | 0.00 | 0.0000 | 0.0000 | 0.19 │ │ │ │ │ ║ ║ │ │ │ │ node_4 | node_3 | - | merge | | 100 | 100 | 2 | 1 | 403 | 0 | 0 | 1.00 | 0.2481 | 0.2481 | 10.99 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 4 │ - │ HashIndexJoin │ solutionSet=solutionSet1 │ - │ 100 │ 100 │ 1.00 │ 4 ║ ║ │ │ │ │ joinType=join │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ 5 │ - │ Distinct │ vars=[?s, ?o, ?o1] │ - │ 100 │ 100 │ 1.00 │ 9 ║ ╟────┼────────┼────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 5 │ 6 │ - │ Projection │ vars=[?s, ?o, ?o1] │ retain │ 100 │ 100 │ 1.00 │ 2 ║ ╟────┼────────┼────────┼───────────────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────────┼──────────┼───────────┼───────┼───────────╢ ║ 6 │ - │ - │ TermResolution │ vars=[?s, ?o, ?o1] │ id2value │ 100 │ 100 │ 1.00 │ 11 ║ ╚════╧════════╧════════╧═══════════════════╧═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╧══════════╧══════════╧═══════════╧═══════╧═══════════╝