本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将查询以字节码而不是字符串的格式发送到服务器
在提交查询时,使用字节码而不是字符串具有以下好处:
及早捕获无效查询语法:使用字节码变量让您可以在编译阶段检测到无效的查询语法。如果您使用基于字符串的变量,则在将查询提交到服务器并返回错误之前,您无法发现无效语法。
-
避免基于字符串的性能损失:任何基于字符串的查询提交,不论您使用 WebSocket 还是 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(); }