

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

# 使用 Java 連線至 Neptune 資料庫執行個體
<a name="access-graph-gremlin-java"></a>

下節引導您逐步執行完整的 Java 範例，其會連線至 Neptune 資料庫執行個體，並使用 Apache TinkerPop Gremlin 用戶端執行 Gremlin 周遊。

必須從與您的 Neptune 資料庫執行個體位於同一虛擬私有雲端 (VPC) 的 Amazon EC2 執行個體依照以下指示進行。

**使用 Java 連線至 Neptune**

1. 在 EC2 執行個體上安裝 Apache Maven。如果使用 Amazon Linux 2023 （偏好），請使用：

   ```
   sudo dnf update -y
   sudo dnf install maven -y
   ```

   如果使用 Amazon Linux 2，請從 [https://maven.apache.org/download.cgi：// 下載最新的二進位檔： ](https://maven.apache.org/download.cgi:)

   ```
   sudo yum remove maven -y
   wget https://dlcdn.apache.org/maven/maven-3/ <version>/binaries/apache-maven-<version>-bin.tar.gz
   sudo tar -xzf apache-maven-<version>-bin.tar.gz -C /opt/
   sudo ln -sf /opt/apache-maven-<version> /opt/maven
   echo 'export MAVEN_HOME=/opt/maven' >> ~/.bashrc
   echo 'export PATH=$MAVEN_HOME/bin:$PATH' >> ~/.bashrc
   source ~/.bashrc
   ```

1. **安裝 Java。**Gremlin 程式庫需要 Java 8 或 11。您可以安裝 Java 11，如下所示：
   + 如果您使用的是 [Amazon Linux 2 (AL2)](https://aws.amazon.com/amazon-linux-2)：

     ```
     sudo amazon-linux-extras install java-openjdk11
     ```
   + 如果您使用的是 [Amazon Linux 2023 (AL2023)](https://docs.aws.amazon.com/linux/al2023/ug/what-is-amazon-linux.html)：

     ```
     sudo yum install java-11-amazon-corretto-devel
     ```
   + 對於其他發行版，請使用以下任一適當的方式：

     ```
     sudo yum install java-11-openjdk-devel
     ```

     或：

     ```
     sudo apt-get install openjdk-11-jdk
     ```

1. **將 Java 11 設定為 EC2 執行個體上的預設執行期：**輸入以下命令，將 Java 8 設定為 EC2 執行個體上的預設執行期：

   ```
   sudo /usr/sbin/alternatives --config java
   ```

   出現提示時，輸入 Java 11 的編號。

1. **建立名為 `gremlinjava` 的新目錄：**

   ```
   mkdir gremlinjava
   cd gremlinjava
   ```

1.  在 `gremlinjava` 目錄中，建立一個 `pom.xml` 檔案，然後在文字編輯器中開啟檔案：

   ```
   nano pom.xml
   ```

1. 將以下內容 `pom.xml` 檔案，然後儲存檔案：

   ```
   <project xmlns="https://maven.apache.org/POM/4.0.0"
            xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
     <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     </properties>
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.amazonaws</groupId>
     <artifactId>GremlinExample</artifactId>
     <packaging>jar</packaging>
     <version>1.0-SNAPSHOT</version>
     <name>GremlinExample</name>
     <url>https://maven.apache.org</url>
     <dependencies>
       <dependency>
         <groupId>org.apache.tinkerpop</groupId>
         <artifactId>gremlin-driver</artifactId>
         <version>3.7.2</version>
       </dependency>
       <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-jdk14</artifactId>
         <version>1.7.25</version>
       </dependency>
     </dependencies>
     <build>
       <plugins>
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>2.5.1</version>
           <configuration>
             <source>11</source>
             <target>11</target>
           </configuration>
         </plugin>
           <plugin>
             <groupId>org.codehaus.mojo</groupId>
             <artifactId>exec-maven-plugin</artifactId>
             <version>1.3</version>
             <configuration>
               <executable>java</executable>
               <arguments>
                 <argument>-classpath</argument>
                 <classpath/>
                 <argument>com.amazonaws.App</argument>
               </arguments>
               <mainClass>com.amazonaws.App</mainClass>
               <complianceLevel>1.11</complianceLevel>
               <killAfter>-1</killAfter>
             </configuration>
           </plugin>
       </plugins>
     </build>
   </project>
   ```
**注意**  
如果您要修改現有的 Maven 專案，所需的相依性將在先前的程式碼中反白顯示。

1. 若要為原始程式碼範例 (`src/main/java/com/amazonaws/`) 建立子目錄，在命令列輸入下列命令：

   ```
   mkdir -p src/main/java/com/amazonaws/
   ```

1. 在 `src/main/java/com/amazonaws/` 目錄中，建立一個名為 `App.java` 的檔案，然後在文字編輯器中開啟檔案。

   ```
   nano src/main/java/com/amazonaws/App.java
   ```

1. 將以下內容複製到 `App.java` 檔案。將 *your-neptune-endpoint* 取代為 Neptune 資料庫執行個體的地址。不要**在 `addContactPoint` 方法中包括 `https://` 字首。
**注意**  
如需尋找 Neptune 資料庫執行個體主機名稱的相關資訊，請參閱 [連線至 Amazon Neptune 端點](feature-overview-endpoints.md)。

   ```
   package com.amazonaws;
   import org.apache.tinkerpop.gremlin.driver.Cluster;
   import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
   import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
   import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal;
   import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection;
   import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
   import org.apache.tinkerpop.gremlin.structure.T;
   
   public class App
   {
     public static void main( String[] args )
     {
       Cluster.Builder builder = Cluster.build();
       builder.addContactPoint("your-neptune-endpoint");
       builder.port(8182);
       builder.enableSsl(true);
   
       Cluster cluster = builder.create();
   
       GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster));
   
       // Add a vertex.
       // Note that a Gremlin terminal step, e.g. iterate(), is required to make a request to the remote server.
       // The full list of Gremlin terminal steps is at https://tinkerpop.apache.org/docs/current/reference/#terminal-steps
       g.addV("Person").property("Name", "Justin").iterate();
   
       // Add a vertex with a user-supplied ID.
       g.addV("Custom Label").property(T.id, "CustomId1").property("name", "Custom id vertex 1").iterate();
       g.addV("Custom Label").property(T.id, "CustomId2").property("name", "Custom id vertex 2").iterate();
   
       g.addE("Edge Label").from(__.V("CustomId1")).to(__.V("CustomId2")).iterate();
   
       // This gets the vertices, only.
       GraphTraversal t = g.V().limit(3).elementMap();
   
       t.forEachRemaining(
         e ->  System.out.println(t.toList())
       );
   
       cluster.close();
     }
   }
   ```

   如需使用 SSL/TLS (這是必要的) 連線至 Neptune 的說明，請參閱 [SSL/TLS 組態](#access-graph-gremlin-java-ssl)。

1. 使用下列 Maven 命令編譯並執行範例：

   ```
   mvn compile exec:exec
   ```

上述範例使用 `g.V().limit(3).elementMap()` 周遊傳回圖形中前兩個頂點的金鑰和每個屬性值的對應。若要查詢其他內容，將其換成其他使用其中一個適當之結束方法的 Gremlin 周遊。

**注意**  
Gremlin 查詢最後的部分 `.toList()` 用來提交周遊至伺服器，以供進行評估。如果您未包含該方法或其他同等方法，該查詢不會提交到 Neptune 資料庫執行個體。  
您也必須在新增頂點或邊緣時附加適當結尾，例如當您使用 `addV( )` 步驟時。

以下方法會查詢提交至 Neptune 資料庫執行個體：
+ `toList()`
+ `toSet()`
+ `next()`
+ `nextTraverser()`
+ `iterate()`

## Gremlin Java 用戶端的 SSL/TLS 組態
<a name="access-graph-gremlin-java-ssl"></a>

Neptune 需要預設啟用 SSL/TLS。一般而言，如果 Java 驅動程式是使用 `enableSsl(true)` 設定的，它可以連線至 Neptune，而不必設定 `trustStore()` 或 `keyStore()`，其中具有憑證的本機副本。

不過，如果您連線的執行個體沒有透過其驗證公有憑證的網際網路連線，或者如果您使用的憑證不是公有的，則您可以採取下列步驟來設定本機憑證副本：

**設定本機憑證副本以啟用 SSL/TLS**

1. 從 Oracle 下載並安裝 [keytool](https://docs.oracle.com/javase/9/tools/keytool.htm#JSWOR-GUID-5990A2E4-78E3-47B7-AE75-6D1826259549)。這將使設定本機金鑰存放區更加容易。

1. 下載 `SFSRootCAG2.pem` CA 憑證 (Gremlin Java SDK 需要憑證來驗證遠端憑證)。

   ```
   wget https://www.amazontrust.com/repository/SFSRootCAG2.pem
   ```

1. 以 JKS 或 PKCS12 格式建立金鑰存放區。此範例使用 JKS。根據提示回答後面的問題。稍後將需要您在此處建立的密碼：

   ```
   keytool -genkey -alias (host name) -keyalg RSA -keystore server.jks
   ```

1. 將您下載的 `SFSRootCAG2.pem` 檔案匯入至新建立的金鑰存放區：

   ```
   keytool -import -keystore server.jks -file .pem
   ```

1. 以程式設計方式設定 `Cluster` 物件：

   ```
   Cluster cluster = Cluster.build("(your neptune endpoint)")
                            .port(8182)
                            .enableSSL(true)
                            .keyStore(‘server.jks’)
                            .keyStorePassword("(the password from step 2)")
                            .create();
   ```

   如果想要的話，您可以在組態檔案中執行相同的操作，就像您使用 Gemlin 主控台所做一樣：

   ```
   hosts: [(your neptune endpoint)]
   port: 8182
   connectionPool: { enableSsl: true, keyStore: server.jks, keyStorePassword: (the password from step 2) }
   serializer: { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}
   ```

## IAM 身分驗證
<a name="access-graph-gremlin-java-iam"></a>

Neptune 支援 [IAM 身分驗證](iam-auth-enable.md)，以控制對資料庫叢集的存取。如果您已啟用 IAM 身分驗證，則需要使用 Signature 第 4 版簽署來驗證您的請求。如需從 Java 用戶端連線的詳細說明和程式碼範例，請參閱 [使用 IAM 搭配 Gremlin Java 連線至 Amazon Neptune 資料庫](iam-auth-connecting-gremlin-java.md)。