使用 Java 客户端连接到 Neptune 数据库实例
下一节将引导您运行一个完整的 Java 示例,该示例连接到 Neptune 数据库实例,并使用 Apache TinkerPop Gremlin 客户端执行 Gremlin 遍历。
必须从与您的 Neptune 数据库实例位于同一虚拟私有云 (VPC) 中的 Amazon EC2 实例中按照这些说明操作。
使用 Java 连接到 Neptune
-
在您的 EC2 实例上安装 Apache Maven。如果使用的是 Amazon Linux 2023(首选),请使用:
sudo dnf update -y sudo dnf install maven -y如果使用的是 Amazon Linux 2,请从 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 -
安装 Java。Gremlin 库需要 Java 8 或 11。您可以按如下方式安装 Java 11:
-
如果您使用的是 Amazon Linux 2 (AL2)
: sudo amazon-linux-extras install java-openjdk11 -
如果您使用的是 Amazon Linux 2023 (AL2023):
sudo yum install java-11-amazon-corretto-devel -
对于其它发行版,请使用以下适当的发行版:
sudo yum install java-11-openjdk-devel或者:
sudo apt-get install openjdk-11-jdk
-
-
将 Java 11 设置为 EC2 实例上的默认运行时系统:输入以下内容将 Java 8 设置为 EC2 实例上的默认运行时系统:
sudo /usr/sbin/alternatives --config java在系统提示时,输入 Java 11 的版本号。
-
创建名为
gremlinjava的新目录:mkdir gremlinjava cd gremlinjava -
在
gremlinjava目录中,创建pom.xml文件,然后在文本编辑器中打开它:nano pom.xml -
将以下内容复制到
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> <!-- https://mvnrepository.com/artifact/org.apache.tinkerpop/gremlin-groovy (Not needed for TinkerPop version 3.5.2 and up) <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-groovy</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 项目,则所需依赖项将在上述代码中突出显示。
-
通过在命令行中键入以下命令来为示例源代码创建子目录 (
src/main/java/com/amazonaws/):mkdir -psrc/main/java/com/amazonaws/ -
在
src/main/java/com/amazonaws/目录中,创建名为App.java的文件,然后在文本编辑器中打开它。nanosrc/main/java/com/amazonaws/App.java -
将以下内容复制到
App.java文件中。将your-neptune-endpoint替换为 Neptune 数据库实例的地址。请不要在addContactPoint方法中包括https://前缀。注意
有关查找 Neptune 数据库实例的主机名的信息,请参阅连接到 Amazon Neptune 端点。
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 配置。
-
使用以下 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 配置
Neptune 要求默认情况下启用 SSL/TLS。通常,如果使用 enableSsl(true) 配置 Java 驱动程序,则它可以连接到 Neptune,而无需使用证书的本地副本设置 trustStore() 或 keyStore()。早期版本的 TinkerPop 鼓励使用 keyCertChainFile() 来配置本地存储的 .pem 文件,但此功能已弃用,在 3.5.x 之后不再可用。如果您通过 SFSRootCAG2.pem 将该设置与公有证书结合使用,则现在可以删除本地副本。
但是,如果您连接的实例没有用来验证公有证书的互联网连接,或者您使用的证书不是公有证书,则可以采取以下步骤来配置本地证书副本:
设置本地证书副本以启用 SSL/TLS
-
从 Oracle 下载并安装 keytool
。这将使设置本地密钥存储变得容易得多。 -
下载
SFSRootCAG2.pemCA 证书(Gremlin Java SDK 需要证书来验证远程证书):wget https://www.amazontrust.com/repository/SFSRootCAG2.pem -
以 JKS 或 PKCS12 格式创建密钥存储。此示例使用 JKS。根据提示回答接下来的问题。稍后将需要您在此处创建的密码:
keytool -genkey -alias(host name)-keyalg RSA -keystore server.jks -
将您下载
SFSRootCAG2.pem的文件导入到新创建的密钥存储中:keytool -import -keystore server.jks -file .pem -
以编程方式配置
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:8182connectionPool: { enableSsl: true, keyStore: server.jks, keyStorePassword:(the password from step 2)} serializer: { className: org.apache.tinkerpop.gremlin.util.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}