

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

# Neptune ML의 연결 예측 모델을 사용한 Gremlin 연결 예측 쿼리
<a name="machine-learning-gremlin-link-prediction-queries"></a>

연결 예측 모델은 다음과 같은 문제를 해결할 수 있습니다.
+ **헤드 노드 예측**: 버텍스와 엣지 유형이 주어졌을 때, 해당 버텍스는 어떤 버텍스에서 연결될 가능성이 높은가요?
+ **테일 노드 예측**: 버텍스와 엣지 레이블이 주어졌을 때, 해당 버텍스는 어떤 버텍스와 연결될 가능성이 있나요?

**참고**  
엣지 예측은 Neptune ML에서 아직 지원되지 않습니다.

아래 예제에서는 엣지 `Rated`로 연결된 버텍스 `User` 및 `Movie`가 있는 간단한 그래프를 생각해 보세요.

다음은 영화 `"movie_1"`, `"movie_2"`, `"movie_3"`에 평점을 매길 가능성이 가장 높은 상위 5명의 사용자를 예측하는 데 사용되는 샘플 헤드 노드 예측 쿼리입니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .with("Neptune#ml.limit", 5)
 .V("movie_1", "movie_2", "movie_3")
 .in("rated").with("Neptune#ml.prediction").hasLabel("user")
```

다음은 테일 노드 예측에 대한 유사한 예로서, 사용자 `"user_1"`이 평점을 매길 가능성이 높은 상위 5개 영화를 예측하는 데 사용됩니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("user_1")
 .out("rated").with("Neptune#ml.prediction").hasLabel("movie")
```

엣지 레이블과 예측된 버텍스 레이블이 모두 필요합니다. 둘 중 하나를 생략하면 예외가 발생합니다. 예를 들어, 예측된 버텍스 레이블이 없는 다음 쿼리는 예외가 발생합니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("user_1")
 .out("rated").with("Neptune#ml.prediction")
```

마찬가지로, 엣지 레이블이 없는 다음 쿼리에서도 예외가 발생합니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("user_1")
 .out().with("Neptune#ml.prediction").hasLabel("movie")
```

이러한 예외가 반환하는 특정 오류 메시지는 [Neptune ML 예외 목록](machine-learning-gremlin-exceptions.md)을 참조하세요.

## 기타 연결 예측 쿼리
<a name="machine-learning-gremlin-other-link-prediction-queries"></a>

`select()` 단계를 `as(`) 단계와 함께 사용하여 예측된 버텍스를 입력 버텍스와 함께 출력할 수 있습니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("movie_1").as("source")
 .in("rated").with("Neptune#ml.prediction").hasLabel("user").as("target")
 .select("source","target")

g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("user_1").as("source")
 .out("rated").with("Neptune#ml.prediction").hasLabel("movie").as("target")
 .select("source","target")
```

다음과 같이 무한 쿼리를 만들 수 있습니다.

```
g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("user_1")
 .out("rated").with("Neptune#ml.prediction").hasLabel("movie")

g.with("Neptune#ml.endpoint","node-prediction-movie-lens-endpoint")
 .with("Neptune#ml.iamRoleArn","arn:aws:iam::0123456789:role/sagemaker-role")
 .V("movie_1")
 .in("rated").with("Neptune#ml.prediction").hasLabel("user")
```

## 연결 예측 쿼리에서 유도 추론 사용
<a name="machine-learning-gremlin-link-predict-inductive"></a>

Jupyter Notebook의 기존 그래프에 다음과 같이 새 노드를 추가한다고 가정해 보겠습니다.

```
%%gremlin
g.addV('label1').property(id,'101').as('newV1')
 .addV('label2').property(id,'102').as('newV2')
 .V('1').as('oldV1')
 .V('2').as('oldV2')
 .addE('eLabel1').from('newV1').to('oldV1')
 .addE('eLabel2').from('oldV2').to('newV2')
```

그런 다음 유도 추론 쿼리를 사용하여 새 노드를 고려하면서 헤드 노드를 예측할 수 있습니다.

```
%%gremlin
g.with("Neptune#ml.endpoint", "lp-ep")
 .with("Neptune#ml.iamRoleArn", "arn:aws:iam::123456789012:role/NeptuneMLRole")
 .V('101').out("eLabel1")
 .with("Neptune#ml.prediction")
 .with("Neptune#ml.inductiveInference")
 .hasLabel("label2")
```

결과:

```
==>V[2]
```

마찬가지로, 유도 추론 쿼리를 사용하여 새 노드를 고려하면서 테일 노드를 예측할 수 있습니다.

```
%%gremlin
g.with("Neptune#ml.endpoint", "lp-ep")
 .with("Neptune#ml.iamRoleArn", "arn:aws:iam::123456789012:role/NeptuneMLRole")
 .V('102').in("eLabel2")
 .with("Neptune#ml.prediction")
 .with("Neptune#ml.inductiveInference")
 .hasLabel("label1")
```

결과:

```
==>V[1]
```