本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將查詢以位元碼形式而非字串形式傳送至伺服器
在以下情況提交查詢時,使用位元碼來取代字串具有優勢:
早期擷取無效的查詢語法:使用位元碼變體可讓您在編譯階段偵測無效的查詢語法。如果您使用字串變體,直到查詢送至伺服器之前都無法發現無效的語法,此時會傳回錯誤。
-
避免基於字符串的性能損失:任何基於字符串的查詢提交(無論您使用 WebSockets 或HTTP)都會導致分離的頂點,這意味著 Vertex 對象包含 ID,Label 以及與頂點關聯的所有屬性(請參閱元素的屬性
)。 在不需要屬性的情況下,這可能會導致伺服器上不必要的運算。例如,如果客戶想要使用查詢
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(); }