openCypher explain 功能 - Amazon Neptune

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

openCypher explain 功能

此功能 openCypher explain是 Amazon Neptune 中的自助式工具,可協助您了解 Neptune 引擎採用的執行方法。若要叫用說明,您可以使用 將參數傳遞至 openCypher HTTPS請求explain=mode,其中 mode值可以是下列其中一項:

  • static – 在 static 模式中,explain 只會列印查詢計畫的靜態結構。它實際上並不會執行查詢。

  • dynamic – 在 dynamic 模式中,explain 也會執行查詢,並包含查詢計畫的動態層面。這些層面可能包含經由運算子流動的中繼繫結數和傳入繫結與傳出繫結的比率,以及每個運算子所花費的時間。

  • details – 在 details 模式下, 會explain列印動態模式顯示的資訊和其他詳細資訊,例如實際 openCypher 查詢字串,以及聯結運算子基礎模式的預估範圍計數。

例如,使用 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"

Neptune openCypher explain中 的限制

目前的 版本 openCypher 說明有下列限制:

  • Explain 計畫目前僅適用於執行唯讀操作的查詢。不支援執行任何類型變動的查詢,例如 CREATEDELETEMERGESET 等等。

  • 特定計畫的運算子和輸出可能會在未來版本中變更。

DFE 輸出中的 openCypher explain運算子

若要使用 openCypher explain功能提供的資訊,您需要了解DFE查詢引擎運作方式 (DFENeptune 用來處理 openCypher 查詢的引擎) 的一些詳細資訊。

DFE 引擎會將每個查詢轉換為運算子管道。從第一個運算子開始,中繼解決方案會透過此運算子管道從一個運算子流至下一個運算子。Explain 資料表中的每一列都代表評估時間點之前的結果。

可以出現在DFE查詢計畫中的運算子如下所示:

DFEApply – 在儲存在指定變數中的值上執行引數區段中指定的函數

DFEBindRelation – 將變數與指定名稱綁定在一起

DFEChunkLocalSubQuery – 這是一種非封鎖操作,可做為執行中子查詢的包裝函式。

DFEDistinctColumn – 根據指定的變數傳回輸入值的不同子集。

DFEDistinctRelation – 根據指定的變數傳回輸入解決方案的不同子集。

DFEDrain – 出現在子查詢的結尾,做為該子查詢的終止步驟。解決方案的數目會記錄為 Units InUnits Out 一律為零。

DFEForwardValue – 將所有輸入區塊直接複製為輸出區塊,以傳遞給其下游運算子。

DFEGroupByHashIndex – 根據先前計算的雜湊索引 (使用 操作),對輸入解決方案執行分組DFEHashIndexBuild操作。作為輸出,指定的輸入會從包含每個輸入解決方案的群組索引鍵的資料欄延伸。

DFEHashIndexBuild – 在一組變數上建置雜湊索引,做為副作用。此雜湊索引通常會在稍後的作業中重複使用。請參閱 DFEHashIndexJoinDFEGroupByHashIndex 以了解可能使用此雜湊索引的位置。

DFEHashIndexJoin – 根據先前建置的雜湊索引,對傳入的解決方案執行聯結。請參閱 DFEHashIndexBuild 以了解此雜湊索引的建置位置。

DFEJoinExists – 取得左右輸入關係,並保留左關係的值,該關係在指定聯結變數定義的右關係中具有對應的值。

  –   這是一種非封鎖操作,其會做為子查詢的包裝函數,允許它重複執行以在迴圈中使用。

DFEMergeChunks – 這是一個封鎖操作,將來自上游運算子的區塊合併為單一解決方案區塊,以傳遞給其下游運算子 (反向 DFESplitChunks)。

DFEMinus – 取得左右輸入關係,並保留來自左關係的值,該關係中沒有指定聯結變數所定義的右關係中對應的值。如果跨兩個關係的變數沒有重疊,那麼這個運算子只會傳回左側輸入關係。

DFENotExists – 取得左右輸入關係,並保留左關係中沒有對應值的數值,如指定聯結變數所定義。如果跨兩個關係的變數沒有重疊,那麼這個運算子會傳回空的關係。

DFEOptionalJoin – 執行左側外部聯結 (也稱為OPTIONAL聯結):左側的解決方案在右側至少有一個聯結合作夥伴會聯結,而左側沒有右側聯結合作夥伴的解決方案會照原樣轉送。這是一項封鎖操作。

DFEPipelineJoin – 根據pattern引數定義的元組模式聯結輸入。

DFEPipelineRangeCount – 計算符合指定模式的解決方案數量,並傳回包含計數值的單一單元解決方案。

DFEPipelineScan – 掃描指定pattern引數的資料庫,包含或不包含欄 (多個) 上的指定篩選條件。

DFEProject – 僅接受多個輸入資料欄和專案所需的資料欄。

DFEReduce – 對指定的變數執行指定的彙總函數。

DFERelationalJoin – 使用合併聯結,根據指定的模式索引鍵聯結先前運算子的輸入。這是一項封鎖操作。

DFERouteChunks – 從其單一傳入邊緣取得輸入區塊,並沿著其多個傳出邊緣路由這些區塊。

DFESelectRows – 此運算子會從左側輸入關係解決方案選擇性地取得資料列,以轉送至其下游運算子。根據運算子右側輸入關係中提供的資料列識別碼選取的資料列。

DFESerialize – 將查詢的最終結果序列化為JSON字串序列化,將每個輸入解決方案對應至適當的變數名稱。對於節點和邊緣結果,這些結果會序列化為實體屬性和中繼資料的映射。

DFESort – 採用輸入關係,並根據提供的排序索引鍵產生排序關係。

DFESplitByGroup – 將每個單一輸入區塊從一個傳入邊緣分割為較小的輸出區塊,對應到IDs從另一個傳入邊緣的對應輸入區塊中由資料列識別的資料列群組。

DFESplitChunks – 將每個單一輸入區塊分割為較小的輸出區塊 ( 的反面DFEMergeChunks)。

DFEStreamingHashIndexBuild – 串流版本的 DFEHashIndexBuild

DFEStreamingGroupByHashIndex – 串流版本的 DFEGroupByHashIndex

DFESubquery – 此運算子會出現在所有計劃的開頭,並封裝在DFE引擎上執行的計劃部分,這是 的整個計劃openCypher。

DFESymmetricHashJoin – 使用雜湊聯結,根據指定的模式索引鍵聯結上一個運算子的輸入。這是一項非封鎖操作。

DFESync – 此運算子是支援非封鎖計劃的同步運算子。該運算子從兩個傳入邊緣取得解決方案,並將這些解決方案轉送至適當的下游邊緣。為達同步處理之目的,沿著這些邊緣之一的輸入可以在內部緩衝。

DFETee – 這是一個分支運算子,會將相同的解決方案集傳送至多個運算子。

DFETermResolution – 對其輸入執行當地語系化或全域化操作,分別產生當地語系化或全球化識別符的資料欄。

— 將輸入資料欄中的值清單展開至輸出資料欄,作為個別元素。

DFEUnion – 採用兩個或多個輸入關係,並使用所需的輸出結構描述產生這些關係的聯集。

SolutionInjection – 出現在說明輸出中的所有其他項目之前,在 Units Out 欄中的值為 1。不過,它可做為禁止操作,而且實際上不會將任何解決方案注入DFE引擎。

TermResolution – 在計劃結束時出現,並將物件從 Neptune 引擎轉換為 openCypher 物件。

輸出中的 openCypher explain資料欄

Neptune 在 openCypher 說明輸出時產生的查詢計畫資訊,包含每個資料列一個運算子的資料表。資料表包含以下資料行:

ID – 此運算子在計畫中的數字 ID。

Out #1 (和 Out #2) – 來自此運算子的下游運算子的 ID。最多可有兩個下游運算子。

Name – 此運算子的名稱。

Arguments – 運算子的任何相關詳細資訊。這包括輸入結構描述、輸出結構描述、模式 (適用於 PipelineScanPipelineJoin) 等項目。

Mode – 描述基本運算子行為的標籤。此資料行大多為空白 (-)。其中一個例外是 TermResolution,其中模式可以是 id2value_opencypher,表示從 ID 到 openCypher 值的解析。

Units In – 以輸入形式傳遞至這個運算子的解決方案數目。沒有上游運算子的運算子 (例如 DFEPipelineScanSolutionInjections,以及未插入靜態值的 DFESubquery) 將具有零值。

Units Out – 產生為此運算子之輸出的解決方案數目。DFEDrain 是一種特殊情況,其中要被排除的解決方案數目記錄在 Units In 中,並且 Units Out 始終為零。

RatioUnits OutUnits In 的比率。

時間 (毫秒) – 此運算子耗用CPU的時間,以毫秒為單位。

openCypher 說明輸出的基本範例

以下是輸出的基本範例 openCypher explain。查詢是空氣路由資料集中的單一節點查詢,其中具有explain使用 預設ASCII輸出格式的 details 模式ATL呼叫的機場代碼:

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引擎的查詢執行計畫部分 (對於 openCypher 查詢,整個查詢計畫由 執行DFE)。查詢計畫中的所有運算子都會在 DFESubquery 所參考的 subQuery1 內形成巢狀。唯一的例外是 TermResolution,它將內部具體化IDs為完全序列化的 openCypher 物件。

所有向下推送至DFE引擎的運算子,其名稱都以DFE字首開頭。如上所述,整個 openCypher 查詢計劃是由 執行DFE,因此,除了以 開頭的最終運算子之外,所有TermResolution運算子都會執行DFE

subQuery1 內部,可有零個或多個 DFEChunkLocalSubQueryDFELoopSubQuery 運算子,封裝在記憶體受限機制中執行的推送執行計畫的一部分。這裡的 DFEChunkLocalSubQuery 包含一個用作子查詢輸入的 SolutionInjection。若要在輸出中尋找該子查詢的資料表,請搜尋在 DFEChunkLocalSubQueryDFELoopSubQuery 運算子的 Arguments 資料行中指定的 subQuery=graph URI

subQuery1 中,ID 為 0 的 DFEPipelineScan 會掃描資料庫找出指定的 pattern。該模式會對所有標籤掃描屬性 code 儲存為變數 ?n_code2 的實體 (您可以透過將 airport 附加到 n:airport 根據特定標籤進行篩選)。inlineFilters 引數顯示等於 ATLcode 屬性的篩選。

接下來,DFEChunkLocalSubQuery 運算子加入包含 DFEPipelineJoin 的子查詢的中繼結果。這可確保 ?n 實際上是一個節點,因為先前的 DFEPipelineScan 會掃描任何具有 code 屬性的實體。