HugeGraph图数据库之Gremlin Job规则
程序员文章站
2022-06-12 10:12:00
...
异步任务:
- gremlin
- gremlin不为空,是要执行的脚本
- language不为空,一般是groovy
- 异步脚本不允许传
aliases
,bindings
也没办法传递 - 默认
图的名字(例如hugegraph)
或者graph
为图对象
- 默认’g’为图对象的
GraphTraversalSource
- 异步任务的名字为gremlin的第一行(不大于256字节)
- 异步任务的返回值
- gremlin最后一句是traversal,取最后一句的结果,size不大于10000,否则抛异常
- gremlin最后一句不是traversal,就是最后的变量的值,若是Collection,size不大于10000,否则抛异常
- 异步任务query没有数量限制
- query的限制是以线程为单位的,即ThreadLocal的
- 异步任务在内存中的(map里)数量上限为10000
- 目前不支持上传gremlin以外的其他脚本执行
GremlinRequest-异步脚本
private static class GremlinRequest implements Checkable {
@JsonProperty
private String gremlin;
@JsonProperty
private Map<String, Object> bindings = new HashMap<>();
@JsonProperty
private String language;
@JsonProperty
private Map<String, String> aliases = new HashMap<>();
public String name() {......}
-
gremlin
是脚本内容,不可为空 -
bindings<String, Object>
是gremlin脚本中字符串->对象
的映射关系 -
language
是groovy
,不可为空 -
aliases<String, String>
是标识符替换规则,必须为空 -
方法
name()
返回gremlin
的第一行,长度小于256字节
aliases和bindings的使用过程:
- 先根据
aliase{A:B}
,把字符串A转为字符串B; - 再根据
bindings{B:C}
,把字符串B转为对象C
默认增加
aliases{图的名字 : "graph"}
HugeScriptTraversal
public final class HugeScriptTraversal<S, E> extends DefaultTraversal<S, E> {
private final TraversalSourceFactory<TraversalSource> factory;
private final String script;
private final String language;
private final Map<String, Object> bindings;
private final Map<String, String> aliases;
private Object result;
......
@Override
public void applyStrategies() throws IllegalStateException {
// "g"为GraphTraversalSource
bindings.put("g", this.factory.createTraversalSource(this.graph)
.withStrategies(strategies));
// "graph"或"图的名字"为HugeGraph对象
bindings.put("graph", this.graph);
bindings.put(图的名字, this.graph);
try {
Object result = engine.eval(this.script, bindings);
// 最后一句是traversal,result为空
if (result instanceof Admin) {
@SuppressWarnings({ "unchecked", "resource" })
Admin<S, E> traversal = (Admin<S, E>) result;
traversal.getSideEffects().mergeInto(this.sideEffects);
traversal.getSteps().forEach(this::addStep);
this.strategies = traversal.getStrategies();
} else {
// 最后一句不是traversal,result为最后一句
this.result = result;
}
super.applyStrategies();
......
groovy知识
def proc = command.execute();
def outputStream = new StringBuffer();
proc.waitForProcessOutput(outputStream, System.err)
//proc.waitForProcessOutput(System.out, System.err)
- 定义map
def map = [:]
// 注意:不是 def map = {}
在groovy中"{}"是闭包closure
- 异常
groovy.lang.readonlypropertyexception cannot set readonly property: xxx for class yyy
往往是出现了变量覆盖的问题(重名)
在groovy中"."后的也视为标识符,是可以与变量标识符相互覆盖的