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

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

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

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'值参数

ResultSet results = client.submit(dsl, parameters);

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)

常见问题

1. 模版化参数个数限制

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

2. 模版化中参数的选取

一类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)

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

2. List参数支持

部分Gremlin Step参数不支持数组类型参数,使用List或Set等多值类型做bindings中占位符key对应的value,会导致错误,需要使用多个占位符分别指定多值类型中的元素。

# 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)