

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

# 使用 Java 客户端连接到 Neptune 数据库实例
<a name="access-graph-gremlin-java"></a>

以下部分将引导您完成一个完整的 Java 示例的运行，该示例连接到 Neptune 数据库实例并使用 Apache Gremlin 客户端执行 Gremlin 遍历。 TinkerPop

必须从与您的 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：
   + 如果你使用的是[亚马逊 Linux 2 (AL2)](https://aws.amazon.com/amazon-linux-2)：

     ```
     sudo amazon-linux-extras install java-openjdk11
     ```
   + 如果你使用的是[亚马逊 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 需要在默认情况下处于启用状态。通常，如果使用 `enableSsl(true)` 配置 Java 驱动程序，则它可以连接到 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();
   ```

   如果您愿意，您可以在配置文件中做同样的事情，就像您在 Gremlin 控制台上所做的那样：

   ```
   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 身份验证，则需要使用签名版本 4 签名来验证您的请求。有关从 Java 客户端进行连接的详细说明和代码示例，请参阅[通过 Gremlin Java 使用 IAM 连接到 Amazon Neptune 数据库](iam-auth-connecting-gremlin-java.md)。