如何在Spring Boot(Java)中对接使用Amazon Neptune数据库?
Spring Boot(Java)对接Amazon Neptune完整流程
1. 引入核心依赖
你可以根据自己使用的查询类型(Gremlin/SPARQL)选择对应依赖,绝大多数场景下Neptune使用Gremlin做图查询,Maven依赖配置如下:
<!-- Spring Boot 基础依赖(按需引入对应场景的starter即可) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Gremlin 官方驱动,版本必须和你使用的Neptune引擎支持的TinkerPop版本匹配 --> <dependency> <groupId>org.apache.tinkerpop</groupId> <artifactId>gremlin-driver</artifactId> <version>3.6.4</version> </dependency> <!-- 若你的Neptune开启了IAM身份认证,额外添加以下两个依赖 --> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>auth</artifactId> <version>2.20.0</version> </dependency> <dependency> <groupId>software.amazon.neptune</groupId> <artifactId>amazon-neptune-sigv4-signer</artifactId> <version>2.4.0</version> </dependency>
2. 配置连接参数
在application.yml或application.properties中添加Neptune连接配置,你可以直接复用之前原生Java连接时使用的参数:
neptune: endpoint: 你的Neptune集群端点地址 port: 8182 # Neptune默认端口 enable-iam-auth: false # 开启IAM认证则设为true region: 你的Neptune所在AWS区域 pool-size: 5 # 连接池大小可按业务调整
3. 配置Gremlin客户端托管到Spring容器
编写配置类将连接客户端和查询源声明为Spring Bean,避免重复创建连接:
import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal; // IAM认证需要额外导入以下类 import software.amazon.neptune.driver.auth.NeptuneNettyHttpSigV4Signer; import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider; @Configuration public class NeptuneConfig { @Value("${neptune.endpoint}") private String endpoint; @Value("${neptune.port}") private Integer port; @Value("${neptune.enable-iam-auth}") private Boolean enableIamAuth; @Value("${neptune.region}") private String region; @Value("${neptune.pool-size}") private Integer poolSize; @Bean public Cluster neptuneCluster() { Cluster.Builder clusterBuilder = Cluster.build() .addContactPoint(endpoint) .port(port) .enableSsl(true) // Neptune默认强制SSL连接,不可关闭 .maxConnectionPoolSize(poolSize); // 开启IAM认证时添加签名拦截器 if(enableIamAuth) { clusterBuilder.handshakeInterceptor( new NeptuneNettyHttpSigV4Signer(region, DefaultCredentialsProvider.create()) ); } return clusterBuilder.create(); } @Bean public GraphTraversalSource graphTraversalSource(Cluster neptuneCluster) { // "g"对应Neptune默认的查询根,和你在工作台使用的前缀一致 return traversal().withRemote(DriverRemoteConnection.using(neptuneCluster, "g")); } }
4. 业务代码调用查询
直接注入GraphTraversalSource即可执行你在Neptune工作台写的任意Gremlin查询,语法完全一致:
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; import java.util.Map; @Service public class NeptuneBizService { @Autowired private GraphTraversalSource g; // 示例:查询所有label为Person的顶点的name属性 public List<String> getAllPersonNames() { // 语句和工作台写的Gremlin完全一致 return g.V().hasLabel("Person").values("name").toList(); } // 示例:执行带条件的自定义查询返回属性映射 public List<Map<Object, Object>> getPersonByAge(Integer minAge) { return g.V().hasLabel("Person").has("age", gte(minAge)).valueMap().toList(); } }
注意事项
- 若你使用SPARQL查询RDF数据,无需引入Gremlin驱动,直接用RestTemplate/Feign调用Neptune的SPARQL HTTP接口即可,IAM认证的话在请求头加上SigV4签名即可
- 生产环境不要硬编码AK/SK,AWS环境内部署的应用直接使用实例角色自动获取凭证即可
- 本地开发时确保你的网络已经打通Neptune所在VPC,或者使用SSH隧道代理,这和你之前原生Java连接的要求一致
内容的提问来源于stack exchange,提问作者Tien Vu
相关产品推荐
相关产品推荐

