この記事は、HUAWEI CLOUDコミュニティ「パラメーター化されたクエリを使用してCypherクエリのパフォーマンスを向上させる:HUAWEI CLOUDグラフエンジンGESを例として取り上げる」、著者:Mayfly andtheSeaから共有されています。
DBMSでは、パラメータ化されたクエリはSQLインジェクション攻撃を防ぐための効果的な手段と見なされています。HUAWEI CLOUDグラフエンジンGESは、グレムリンおよびサイファークエリ言語のパラメーター化されたクエリサポートを提供します。パラメーター化されたクエリを使用すると、フロントエンドユーザーが悪意のあるコマンドを任意に入力してステートメントの実行に影響を与えるのを防ぐだけでなく、クエリコンパイルキャッシュを効果的に使用してクエリのパフォーマンスを向上させることができます。
パラメータ化されたクエリ(パラメータ化されたクエリ)、Wikiでの説明は、クライアントがクエリステートメントをデータサーバーに送信して要求するときに、ユーザーが入力した値や文字列データの代わりに変数名を使用し、要求で説明します。各変数名が参照する本体。この場合、変数名で参照されるコンテンツはSQL言語のクエリコンパイルに関与しないため、ユーザー入力データに破壊的な命令が含まれていても、データベースによって実行されません。
たとえば、Cypher-JDBC-Driverを使用してHUAWEI CLOUDグラフエンジンにアクセスするには、対応するパラメーターを設定できます。
public static void main(String[] args) throws ClassNotFoundException {
Class.forName("com.huawei.ges.jdbc.Driver");
String url = "jdbc:ges:http://{
{graph_ip}}:{
{graph_port}}/ges/v1.0/{
{project_id}}/graphs/{
{graph_name}}/action?action_id=execute-cypher-query";
url = url.replace("{
{graph_ip}}", ip).replace("{
{graph_port}}",port + "").replace("{
{project_id}}", projectId).replace("{
{graph_name}}", graphName);
Properties prop = new Properties();
prop.setProperty("X-Auth-Token", token);
try(Connection conn = DriverManager.getConnection(url,prop)){
String query = "match (n:movie) where n.genres=? return n.title";
try(PreparedStatement stmt = conn.prepareStatement(query)){
stmt.setString(1, "Comedy");
try(ResultSet rs = stmt.executeQuery()){
while(rs.next()) {
System.out.println(rs.getString("n.title"));
}
}
}
} catch (SQLException e) {
// do something for e.
}
}
クエリステートメントの疑問符は、JDBCスタイルのパラメータ化されたクエリ変数であり、次のコードのsetStringメソッドを介して値「Comedy」が設定されます。さらに、グラフエンジンは、RESTfulなAPIスタイルのパラメーター化されたクエリもサポートしています。詳細については、公式Webサイトのドキュメントを参照してください。
同時に、パラメーター化されたクエリにより、同じパラメーター化されたクエリステートメントを使用してさまざまなユーザー入力を実行できます。これにより、データベースクエリキャッシュを効率的に利用し、クエリのコンパイル時間を節約し、クエリのパフォーマンスを向上させることができます。たとえば、次の図は、Freebaseデータセットを使用して構築されたいくつかの2ホップおよび3ホップのクエリを示しており、Huawei Cloud Graph EngineのGESで実行され、パラメーター化されたクエリの前後のQPSの変更を示しています。パラメータ化されたクエリを使用すると、qpsが2〜8倍向上したことがわかります。
パラメータ化されたクエリがクエリqpsを改善できるのはなぜですか?まず、クエリステートメントを受信した後のデータサービスの動作を簡単に紹介します。データ管理の分野では、データサービスがクエリステートメントを受信すると、通常、図に示すように、字句と文法の解析、クエリプランの生成、クエリプランの実行の手順を実行します。
ここでは、クエリプランの生成について簡単に紹介します。現在、ほとんどのクエリプラン生成戦略は、コストベースのクエリプラン生成、ルールベースのクエリプラン生成、またはその2つの組み合わせのいずれかです。クエリプランの生成に関係なく、サーバーのコンピューティングリソースを消費する計算集約型のタスクであると同時に、システムは限られた数のクエリプラン生成タスクのみを並行して処理できます。プランジェネレーター内では、ほとんどのデータベースにクエリキャッシュが組み込まれています。つまり、特定の時間範囲内で、同じクエリステートメントがプランナーに入力されると、プランナーは最初にクエリから使用可能なプランがあるかどうかを確認します。キャッシュ。プランが長すぎるか、使用可能なプランがない場合、プラン生成のプロセスが実際に実行されます。
したがって、パラメータ化されたクエリを使用する場合、異なるパラメータを使用するクエリステートメントの本体は同じであるため、クエリのコンパイル段階で同じクエリステートメントと見なされる可能性が高くなり、「複数のクエリ、 1つのコンパイル」。これにより、クエリのパフォーマンスが向上します。コンパイルの効率。
付録:
Freebaseデータセットプロパティグラフのフォーマットスケール:
ポイント数 | 61440292 |
辺の数 | 136253874 |
ラベルの数 | 5417 |
查询语句:
2hop_Q1:match(n1)-[r]->(m1)->(p1)where id(n1)= $ vertex return id(p1)limit 100
2hop_Q2:match(n1)-[r]- >(m1)->(p1)where id(n1)= $ vertex return p1.name limit 100
2hop_Q3:match(n)-[r]->(m)->(p)where id(n) =$vertexおよびm.games>10およびp.nameには「NBA」が含まれます
returnp3hop_Q1:match(n1)-[r1]-(m1)-[r2]-(p1)-(p2)where id(n1 )=$vertexおよびm1.game>0return id(p2)limit 100
3hop_Q2:match(n1)-[r1]-(m1)match(m1)-[r2]-(p1)match(p1)-( p2)ここで、id(n1)= $vertexおよびm1.games>0はid(p2)を返します
関連資料:
[1]パラメーター化されたquery_Baidu百科事典:https://baike.baidu.com/item/%E5%8F%82%E6%95%B0%E5%8C%96%E6%9F%A5%E8%AF%A2 / 4841802?fr = aladdin
[2] GES cypher API: Cypher operation API(2.2.16)_Graph Engine Service GES_API Reference_Business API_HUAWEI CLOUD
[3] Github-opencypher:https://github.com/opencypher/openCypher