我们有一个使用 neptune db 的分析项目。 配置: db.r5d.24xlarge 96核 768G内存。
它包含大约 5000 万个顶点和 5 亿个边。
顶点具有 id、name 和category 属性。 边有 id、日期、标签、分数和一些其他属性。
我一直在运行查询来查找具有 1 和 2 跳的所有可能路径,但大多数情况下都会超时(超时为 60 秒)。仅当处理的顶点/边数较小时,查询才会返回正确的响应。
查询示例:
g
.V()
.filter(values("name").is(fromName))
.repeat(
outE()
.and(
filter(values("tag").is(tag)),
filter(values("date").is(P.gte(dateVal))))
.inV())
.until(loops().is(2))
.filter(values("name").is(toName))
.simplePath()
.path()
.by(T.id)
.by("score");
我的 Neptune java 客户端配置如下:
Cluster cluster =
Cluster.build()
.addContactPoint(neptuneHost)
.port(neptunePort)
.enableSsl(true)
.serializer(Serializers.GRAPHBINARY_V1D0)
.maxConnectionPoolSize(poolSizeMax)
.minConnectionPoolSize(poolSizeMin).build();
DriverRemoteConnection connection = DriverRemoteConnection.using(cluster);
g = traversal().withRemote(connection);
其中 poolSizeMax == poolSizeMin = 8。
我还尝试了具有不同值的连接的以下属性,到目前为止没有运气:
workerPoolSize
maxInProcessPerConnection
maxSimultaneousUsagePerConnection
minSimultaneousUsagePerConnection
我们注意到 Neptune 实例的 CPU 和内存使用率也非常低。
任何有关优化查询或任何其他配置以运行查询而不会超时的指导都会非常有帮助。请注意,我们不能对顶点或边设置 limit(),因为这会导致不正确的输出。谢谢。
因此,这似乎非常符合使用图形数据存储的分析 (OLAP) 风格。 Neptune 最初被设计为 OLTP、事务性图形数据库。它专为更多受限图形查询的高并发性而设计(从一个或几个起点开始,遍历图形,直到解决结束条件)。
如果您今天尝试在 Neptune 上执行类似的操作,则需要构建一个多线程应用程序并将查询拆分为多个可以并行执行的并发子查询。
请在 Twitter 上给我发私信,或通过我在 amazon.com 的 Twitter 账号给我发电子邮件,我很乐意与您电话进一步讨论此问题。
@Taylor 我们也面临着类似的问题,并且很想了解可以在这里解决问题的详细信息。我已在 Linkedin 上向您发送了同样的连接请求。