将查询作为字节码而不是字符串发送到服务器 - Amazon Neptune
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

将查询作为字节码而不是字符串发送到服务器

在提交查询时,使用字节码而不是字符串具有以下好处:

  • 尽早捕获无效的查询语法:  使用字节码变量让您可以在编译阶段检测到无效的查询语法。如果您使用基于字符串的变量,则在将查询提交到服务器并返回错误之前,您无法发现无效语法。

  • 避免基于字符串的性能损失:  任何基于字符串的查询提交,不论您使用 WebSockets 还是 HTTP,都会导致分离的顶点,这意味着顶点对象由 ID、标签以及与顶点关联的所有属性组成(请参阅元素的属性)。

    在不需要属性的情况下,这会导致服务器上不必要的计算。例如,在客户希望使用查询 g.V("hakuna#1") 获得 ID 为“hakuna#1”的顶点时。如果查询是以基于字符串的提交形式发送,服务器将花费时间在 ID、标签以及此顶点的所有属性中检索。如果查询是以字节码提交的形式发送,服务器仅花时间检索顶点的 ID 和标签。

换而言之,不要提交类似于下文的查询:

final Cluster cluster = Cluster.build("localhost") .port(8182) .maxInProcessPerConnection(32) .maxSimultaneousUsagePerConnection(32) .serializer(Serializers.GRAPHBINARY_V1D0) .create(); try { final Client client = cluster.connect(); List<Result> results = client.submit("g.V().has('name','pumba').out('friendOf').id()").all().get(); System.out.println(verticesWithNamePumba); } finally { cluster.close(); }

而是使用字节码提交查询,如下所示:

final Cluster cluster = Cluster.build("localhost") .port(8182) .maxInProcessPerConnection(32) .maxSimultaneousUsagePerConnection(32) .serializer(Serializers.GRAPHBINARY_V1D0) .create(); try { final GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using(cluster)); List<Object> verticesWithNamePumba = g.V().has("name", "pumba").out("friendOf").id().toList(); System.out.println(verticesWithNamePumba); } finally { cluster.close(); }