阿里云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)
文档内容是否对您有帮助?