

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# openCypher `explain` 기능
<a name="access-graph-opencypher-explain"></a>

openCypher `explain` 기능은 Neptune 엔진에 의해 수행되는 실행 접근 방식을 이해하는 데 도움이 되는 Amazon Neptune의 셀프 서비스 도구입니다. Explain을 간접적으로 호출하려면 `explain={{mode}}`를 사용하여 openCypher [HTTPS](access-graph-opencypher-queries.md) 요청에 파라미터를 전달합니다. 여기서 `mode` 값은 다음 중 하나일 수 있습니다.

****
+ **`static`**   –   `static` 모드에서 `explain`은 쿼리 계획의 정적 구조만 출력합니다. 실제로 쿼리를 실행하지는 않습니다.
+ **`dynamic`**   –   `dynamic` 모드에서는 `explain`도 쿼리를 실행하며, 쿼리 계획의 동적 측면도 포함합니다. 여기에는 연산자를 통해 진행되는 중간 바인딩의 수, 수신 바인딩과 발신 바인딩의 비율, 각 연산자에 소요된 총 시간이 포함됩니다.
+ **`details`**   –   `details` 모드에서 `explain`은 동적 모드로 표시된 정보와 조인 연산자의 기본 패턴에 대한 실제 openCypher 쿼리 문자열 및 예상 범위 수와 같은 추가 세부 정보를 출력합니다.

  

예를 들어, `POST` `dynamic` 모드에서를 사용하는 경우:

------
#### [ AWS CLI ]

```
aws neptunedata execute-open-cypher-explain-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "MATCH (n) RETURN n LIMIT 1" \
  --explain-mode dynamic
```

자세한 내용은 AWS CLI 명령 참조의 [execute-open-cypher-explain-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html)를 참조하세요.

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

response = client.execute_open_cypher_explain_query(
    openCypherQuery='MATCH (n) RETURN n LIMIT 1',
    explainMode='dynamic'
)

print(response['results'].read().decode('utf-8'))
```

다른 언어의 AWS SDK 예제는 섹션을 참조하세요[AWS SDK](access-graph-opencypher-sdk.md).

------
#### [ awscurl ]

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=MATCH (n) RETURN n LIMIT 1" \
  -d "explain=dynamic"
```

**참고**  
이 예제에서는 자격 AWS 증명이 환경에 구성되어 있다고 가정합니다. {{us-east-1}}을 Neptune 클러스터의 리전으로 바꿉니다.

------
#### [ curl ]

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=MATCH (n) RETURN n LIMIT 1" \
  -d "explain=dynamic"
```

------

## Neptune의 openCypher `explain`에 대한 제한
<a name="access-graph-opencypher-explain-limitations"></a>

openCypher Explain의 현재 릴리스에는 다음과 같은 제한 사항이 있습니다.
+ Explain 계획은 현재 읽기 전용 작업을 수행하는 쿼리에만 사용할 수 있습니다. `CREATE`, `DELETE`, `MERGE`, `SET` 등과 같은 모든 종류의 변형을 수행하는 쿼리는 지원되지 않습니다.
+ 특정 계획의 연산자 및 출력은 향후 릴리스에서 변경될 수 있습니다.

## openCypher `explain` 출력의 DFE 연산자
<a name="access-graph-opencypher-dfe-operators"></a>

openCypher `explain` 기능이 제공하는 정보를 사용하려면 [DFE 쿼리 엔진](neptune-dfe-engine.md)의 작동 방식에 대한 몇 가지 세부 정보를 이해해야 합니다. DFE는 Neptune이 openCypher 쿼리를 처리하는 데 사용하는 엔진입니다.

DFE 엔진은 모든 쿼리를 연산자의 파이프라인으로 변환합니다. 첫 번째 연산자에서 시작하여 해당 연산자 파이프라인을 통해 중간 솔루션이 한 연산자에서 다음 연산자로 진행됩니다. Explain 표의 각 행은 평가 지점까지의 결과를 나타냅니다.

DFE 쿼리 계획에 나타날 수 있는 연산자는 다음과 같습니다.

**DFEApply**   –   특정 변수에 저장된 값에 대해 인수 섹션에서 지정한 함수를 실행합니다.

**DFEBindRelation**   –   지정된 이름을 가진 변수를 함께 바인딩합니다.

**DFEChunkLocalSubQuery**   –   수행 중인 하위 쿼리에 대한 래퍼 역할을 하는 비차단 작업입니다.

**DFEDistinctColumn**   –   지정된 변수를 기반으로 입력 값의 고유한 하위 세트를 반환합니다.

**DFEDistinctRelation**   –   지정된 변수를 기반으로 입력 솔루션의 고유한 하위 세트를 반환합니다.

**DFEDrain**   –   하위 쿼리의 종료 단계 역할을 하기 위해 하위 쿼리의 끝에 나타납니다. 솔루션 수는 `Units In`으로 기록됩니다. `Units Out`은 항상 0입니다.

**DFEForwardValue**   –   모든 입력 청크를 출력 청크로 직접 복사하여 다운스트림 연산자에 전달합니다.

**DFEGroupByHashIndex**   –   이전에 계산된 해시 인덱스를 기반으로 입력 솔루션에 대해 그룹별 작업을 수행합니다(`DFEHashIndexBuild` 작업 사용). 주어진 입력은 각 입력 솔루션에 대한 그룹 키가 포함된 열로 확장되어 출력됩니다.

**DFEHashIndexBuild**   –   부작용으로 변수 집합에 대한 해시 인덱스를 작성합니다. 이 해시 인덱스는 일반적으로 이후 작업에서 재사용됩니다. 이 해시 인덱스를 사용할 수 있는 위치는 `DFEHashIndexJoin` 또는 `DFEGroupByHashIndex` 섹션을 참조하세요.

**DFEHashIndexJoin**   –   이전에 작성한 해시 인덱스를 기준으로 수신 솔루션에 대한 조인을 수행합니다. 이 해시 인덱스를 작성할 수 있는 위치는 `DFEHashIndexBuild` 섹션을 참조하세요.

**DFEJoinExists**   –   왼쪽 및 오른쪽 입력 관계식을 사용하고, 지정된 조인 변수에 정의된 대로 오른쪽 관계식에 해당 값이 있는 왼쪽 관계식의 값을 유지합니다.

****   –   이 작업은 하위 쿼리의 래퍼 역할을 하는 비차단 작업이므로, 반복 실행하여 루프에서 사용할 수 있습니다.

**DFEMergeChunks**   –   업스트림 연산자의 청크를 단일 솔루션 청크로 결합하여 다운스트림 연산자에 전달하는 차단 연산입니다(`DFESplitChunks`의 역연산).

**DFEMinus**   –   왼쪽 및 오른쪽 입력 관계식을 사용하고, 지정된 조인 변수에 정의된 대로 오른쪽 관계식에 해당 값이 없는 왼쪽 관계식의 값을 유지합니다. 두 관계식 모두에서 변수가 겹치지 않는 경우 이 연산자는 단순히 왼쪽 입력 관계식을 반환합니다.

**DFENotExists**   –   왼쪽 및 오른쪽 입력 관계식을 사용하고, 지정된 조인 변수에 정의된 대로 오른쪽 관계식에 해당 값이 없는 왼쪽 관계식의 값을 유지합니다. 두 관계식 모두에서 변수가 겹치지 않는 경우 이 연산자는 빈 관계식을 반환합니다.

**DFEOptionalJoin**   –   왼쪽 외부 조인(OPTIONAL 조인이라고도 함)을 수행합니다. 오른쪽에 조인 파트너가 하나 이상 있는 왼쪽의 솔루션은 조인되고, 오른쪽에 조인 파트너가 없는 왼쪽의 솔루션은 그대로 전달됩니다. 이는 차단 작업입니다.

**DFEPipelineJoin**   –   `pattern` 인수로 정의된 튜플 패턴에 대해 입력을 조인합니다.

**DFEPipelineRangeCount**   –   지정된 패턴과 일치하는 솔루션 수를 세고 개수 값이 포함된 단일 단항 솔루션을 반환합니다.

**DFEPipelineScan**   –   열에 지정된 필터를 사용하거나 사용하지 않고 데이터베이스에서 지정된 `pattern` 인수를 스캔합니다.

**DFEProject**   –   여러 입력 열을 가져와서 원하는 열만 투영합니다.

**DFEreduce**   –   지정된 변수에 대해 지정된 집계 함수를 수행합니다.

**DFERelationalJoin**   –   병합 조인을 사용하여 지정된 패턴 키를 기반으로 이전 연산자의 입력을 조인합니다. 이는 차단 작업입니다.

**DFERouteChunks**   –   단일 수신 엣지에서 입력 청크를 가져와 여러 개의 발신 엣지를 따라 해당 청크를 라우팅합니다.

**DFESelectRows**   –   이 연산자는 왼쪽 입력 관계식 솔루션에서 선택적으로 행을 가져와 다운스트림 연산자에 전달합니다. 연산자의 오른쪽 입력 관계식에 제공된 행 식별자를 기반으로 행이 선택됩니다.

**DFESerialize**   –   쿼리의 최종 결과를 JSON 문자열로 직렬화하여 각 입력 솔루션을 적절한 변수 이름에 매핑합니다. 노드 및 엣지 결과의 경우 이러한 결과는 엔터티 속성 및 메타데이터의 맵으로 직렬화됩니다.

**DFESort**   –   입력 관계식을 가져와 제공된 정렬 키를 기반으로 정렬된 관계식을 생성합니다.

**DFESplitByGroup**   –   한 수신 엣지의 각 단일 입력 청크를 다른 수신 엣지의 해당 입력 청크에서 행 ID로 식별되는 행 그룹에 해당하는 더 작은 출력 청크로 분할합니다.

**DFESplitChunks**   –   각 단일 입력 청크를 더 작은 출력 청크로 분할합니다(`DFEMergeChunks`의 역연산).

**DFEStreamingHashIndexBuild**   –   `DFEHashIndexBuild`의 스트리밍 버전입니다.

**DFEStreamingGroupByHashIndex**   –   `DFEGroupByHashIndex`의 스트리밍 버전입니다.

**DFE SubQuery**   –   이 연산자는 모든 계획의 시작 부분에 나타나며 [DFE 엔진](neptune-dfe-engine.md)에서 실행되는 계획의 일부, 즉 openCypher의 전체 계획을 캡슐화합니다.

**DFESymmetricHashJoin**   –   해시 조인을 사용하여 지정된 패턴 키를 기반으로 이전 연산자의 입력을 조인합니다. 이는 비차단 작업입니다.

**DFESync**   –   이 연산자는 비차단 계획을 지원하는 동기화 연산자입니다. 두 개의 수신 엣지에서 솔루션을 가져와 해당 다운스트림 엣지로 전달합니다. 동기화를 위해 이러한 엣지 중 하나를 따라 입력이 내부적으로 버퍼링될 수 있습니다.

**DFEtee**   –   동일한 솔루션 세트를 여러 연산자에 보내는 분기 연산자입니다.

**DFETermResolution**   –   입력에 대해 로컬화 또는 글로벌화 작업을 수행하여 로컬화된 식별자 또는 글로벌화된 식별자의 열을 각각 생성합니다.

****   –   입력 열의 값 목록을 개별 요소로 출력 열에 펼칩니다.

**DFEUnion**   –   둘 이상의 입력 관계식을 가져와서 원하는 출력 스키마를 사용하여 통합된 관계식을 생성합니다.

**SolutionInjection**   –   설명 출력의 다른 모든 항목보다 먼저 나타나며 Units Out 열의 값은 1입니다. 하지만 비운영 기능을 하며, 실제로 DFE 엔진에 솔루션을 주입하지 않습니다.

**TermResolution**   –   계획이 끝날 때 표시되며 Neptune 엔진의 객체를 openCypher 객체로 변환합니다.

## openCypher `explain` 출력의 열
<a name="access-graph-opencypher-explain-columns"></a>

Neptune이 openCypher Explain 출력으로 생성하는 쿼리 계획 정보에는 행당 하나의 연산자가 있는 표가 포함됩니다. 이 표에는 다음과 같은 열이 있습니다.

**ID**   –   계획에서 연산자의 숫자 ID입니다.

**Out \#1**(및 **Out \#2**)   –   연산자의 다운스트림에 있는 연산자의 ID입니다. 다운스트림 연산자는 최대 2개까지 있을 수 있습니다.

**Name**   –   연산자의 이름입니다.

**Arguments**   –   연산자에 대한 모든 관련 세부 정보입니다. 여기에는 입력 스키마, 출력 스키마, 패턴(`PipelineScan` 및 `PipelineJoin`용) 등이 포함됩니다.

**Mode**   –   연산자의 기본 동작을 설명하는 레이블입니다. 이 열은 대부분 비어 있습니다(`-`). 한 예외는 `TermResolution`으로, 모드는 `id2value_opencypher`이며 ID에서 openCypher 값까지의 해상도를 나타냅니다.

**Units In**   –   연산자에 입력으로 전달된 솔루션 수입니다. 업스트림 연산자가 없는 연산자(예: 정적 값이 삽입되지 않은 `DFEPipelineScan`, `SolutionInjections`, `DFESubquery` 등)는 값이 0입니다.

**Units Out**   –   연산자의 출력으로 생성된 솔루션 수입니다. `DFEDrain`은 배출되는 솔루션 수가 `Units In` 및 `Units Out`에 항상 0으로 기록되는 특수한 경우입니다.

**Ratio**   –   `Units Out` 대 `Units In`의 비율입니다.

**Time (ms)**   –   연산자가 소비한 CPU 시간(밀리초)입니다.

## openCypher Explain 출력의 기본 예제
<a name="access-graph-opencypher-explain-basic-example"></a>

다음은 openCypher `explain` 출력의 기본 예제입니다. 쿼리는 기본 ASCII 출력 형식의 `details` 모드를 `explain` 사용하여 호출`ATL`하는 공항 코드가 있는 노드에 대한 항공 경로 데이터 세트의 단일 노드 조회입니다.

이 쿼리`explain`를 호출하려면:

------
#### [ AWS CLI ]

```
aws neptunedata execute-open-cypher-explain-query \
  --endpoint-url https://{{your-neptune-endpoint}}:{{port}} \
  --open-cypher-query "MATCH (n {code: 'ATL'}) RETURN n" \
  --explain-mode details
```

자세한 내용은 AWS CLI 명령 참조의 [execute-open-cypher-explain-query](https://docs.aws.amazon.com/cli/latest/reference/neptunedata/execute-open-cypher-explain-query.html)를 참조하세요.

------
#### [ SDK ]

```
import boto3
from botocore.config import Config

client = boto3.client(
    'neptunedata',
    endpoint_url='https://{{your-neptune-endpoint}}:{{port}}',
    config=Config(read_timeout=None, retries={'total_max_attempts': 1})
)

response = client.execute_open_cypher_explain_query(
    openCypherQuery="MATCH (n {code: 'ATL'}) RETURN n",
    explainMode='details'
)

print(response['results'].read().decode('utf-8'))
```

다른 언어의 AWS SDK 예제는 섹션을 참조하세요[AWS SDK](access-graph-opencypher-sdk.md).

------
#### [ awscurl ]

```
awscurl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  --region {{us-east-1}} \
  --service neptune-db \
  -X POST \
  -d "query=MATCH (n {code: 'ATL'}) RETURN n" \
  -d "explain=details"
```

**참고**  
이 예제에서는 자격 AWS 증명이 환경에 구성되어 있다고 가정합니다. {{us-east-1}}을 Neptune 클러스터의 리전으로 바꿉니다.

------
#### [ curl ]

```
curl https://{{your-neptune-endpoint}}:{{port}}/openCypher \
  -d "query=MATCH (n {code: 'ATL'}) RETURN n" \
  -d "explain=details"
```

------

`explain` 출력:

```
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 엔진](neptune-dfe-engine.md)으로 푸시되는 쿼리 실행 계획의 일부를 캡슐화합니다. openCypher 쿼리의 경우 전체 쿼리 계획이 DFE에 의해 실행됩니다. 쿼리 계획의 모든 연산자가 `DFESubquery`에서 참조하는 `subQuery1` 내에 중첩됩니다. 유일한 예외는 내부 ID를 완전히 직렬화된 openCypher 객체로 구체화하는 `TermResolution`입니다.

DFE 엔진으로 푸시되는 모든 연산자의 이름은 `DFE` 접두사로 시작합니다. 위에서 언급한 바와 같이 전체 openCypher 쿼리 계획은 DFE에 의해 실행되므로, 결과적으로 최종 `TermResolution` 연산자를 제외한 모든 연산자는 `DFE`로 시작됩니다.

`subQuery1` 내에는 메모리 경계 메커니즘에서 실행되는 푸시된 실행 계획의 일부를 캡슐화하는 `DFEChunkLocalSubQuery` 또는 `DFELoopSubQuery` 연산자가 0개 이상 있을 수 있습니다. 여기 `DFEChunkLocalSubQuery`에는 하위 쿼리에 대한 입력으로 사용되는 하나의 `SolutionInjection`이 포함되어 있습니다. 출력에서 해당 하위 쿼리의 테이블을 찾으려면 `DFEChunkLocalSubQuery` 또는 `DFELoopSubQuery` 연산자의 `Arguments` 열에 지정된 `subQuery={{graph URI}}`를 검색합니다.

`subQuery1`에서 `ID`가 0인 `DFEPipelineScan`은 지정된 `pattern`에 대해 데이터베이스를 스캔합니다. 패턴은 속성 `code`가 변수 `?n_code2`로 저장된 엔터티를 모든 레이블에서 스캔합니다. `airport`를 `n:airport`에 추가하여 특정 레이블에서 필터링할 수 있습니다. `inlineFilters` 인수는 `ATL`과 동일한 `code` 속성에 대한 필터링을 보여줍니다.

그런 다음 `DFEChunkLocalSubQuery` 연산자는 `DFEPipelineJoin`이 포함된 하위 쿼리의 중간 결과에 조인합니다. 그러면 이전 `DFEPipelineScan`에서 `code` 속성을 가진 엔터티를 스캔하므로, `?n`이 실제로 노드임을 보장합니다.