Gremlin请求参数模板化

阿里云GDB推荐使用String-based Gremlin scripts请求与GDB服务端交互,在使用各SDK发送scripts请求时,需要将请求中参数部分模板化以提升查询性能。

重要

参数模板化是使用一个Map结构参数bindings,将scripts请求中可变数据参数用占位符替换,同时再将占位符和对应的数据值放到bindings,达到使用相同scripts请求、不同bindings完成同类型Gremlin访问。

各语言SDK的参数模板化写法相似,以下给出关键部分代码示例。

常见问题

  • 内部保留字

    • proprty(id, G__id)这个不加引号的id为主键,满足全局唯一性约束

    • 你在设置参数绑定时,不要使用以下g.addV(label).property('id', id)写法,因为id、label均为系统内部保留字,语句中加引号的id代表一个普通属性,不满足唯一性约束。

  • 模板化参数个数限制

    GDB支持bindings中模板化参数的个数最大值是128,不可修改。

  • 模板化中参数的选取

    一类scripts请求通常使用在固定场景时,数据参数中仅有部分是可变的,我们只需要给可变部分建立占位符,固定数据部分可以直接硬编码到请求中。

    以下示例请求是添加标签为’person’,带’name’和’age’两个属性的点。

    dsl = "g.addV('person').property('name', G___PV1).property('age', G___PV2)"
    
    bindings = {"G___PV1":"Jack","G___PV2":29}
    client.submit(dsl, bindings).all().join()

    参数dsl不变,使用获取到的’name’和’age’数据填充bindings。提交请求写入点数据。

  • List参数支持

    // 带有list类型,hasId、within等  valueMap见下文,需要使用多个占位符
    String dsl = "g.V().has(G__key1, within(G__value1)).valueMap(true)";
    Map<String, Object> parameters= new HashMap<>(1);
    List<String> values = new ArrayList<>(Arrays.asList("beijing", "shanghai", "shenzhen"));
    parameters.put("G__key1", "location");
    parameters.put("G__value1", values);
    List<Result> result = client.submit(dsl, parameters).all().join();

    部分Gremlin Step参数不支持数组类型参数,比如ValueMap,需要使用多个占位符分别指定多值类型中的元素。

    # valueMap参数不支持数组,参数错误
    bindings = {"G___PKs":["name","age"]}
    dsl = "g.V().hasLabel('person').valueMap(G___PKs)"
    client.sumbit(dsl, bindings)
    
    # 使用两个占位符表示两个参数,正确
    bindings = {"G___PK1":"name","G___PK2":"age"}
    dsl = "g.V().hasLabel('person').valueMap(G___PK1,G___PK2)"
    client.submit(dsl, bindings).all().join()

Java参数模板化


String dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)";

Map<String, Object> parameters = new HashMap<>();
parameters.put("G___id","sand131_id_5_99"); // 点id参数
parameters.put("G___label","person");       // 点label参数
parameters.put("G___name","Jack");          // 点属性'name'值参数

List<Result> result = client.submit(dsl, parameters).all().join();

python参数模板化

dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)"

parameters = {}
parameters["G___id"] = "sand131_id_5_99"
parameters["G___label"] = "person"
parameters["G___name"] = "Jack"

results = client.submit(dsl, bindings=parameters).all().result()

.Net参数模板化

string dsl ="g.addV(G___label).property(id,G___id).property('name',G___name)";
Dictionary<string, object> parameters = new Dictionary<string, object> {
                    {"G___id", "sand131_id_5_99"},
                    {"G___label", "person"},
                    {"G___name", "Jack"}};

gremlinClient.SubmitAsync<dynamic>(dsl, parameters);

Nodejs参数模板化

function addVertex1()
{
    return client.submit("g.addV(G___label).property(id,G___id).property('name',G___name)",{
        G___id: "sand131_id_5_99",
        G___label: "person",
        G___name: "Jack"
    }).then(data => {
        console.log("Add Vertex Result: %s\n", JSON.stringify(data));
    });
}

Go参数模板化

dsl := "g.addV(G___label).property(id,G___id).property('name',G___name)"
parameters := make(map[string]interface{})
parameters["G___id"] = "sand131_id_5_99"
parameters["G___label"] = "person"
parameters["G___name"] = "Jack"

results, err := client.SubmitScriptBound(dsl, parameters)