HugeGraph图数据库之Gremlin Job规则

异步任务:

  • gremlin
    1. gremlin不为空,是要执行的脚本
    2. language不为空,一般是groovy
    3. 异步脚本不允许传aliasesbindings也没办法传递
    4. 默认图的名字(例如hugegraph)或者graph图对象
    5. 默认’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脚本中字符串->对象的映射关系

  • languagegroovy,不可为空

  • aliases<String, String>是标识符替换规则,必须为空

  • 方法name()返回gremlin的第一行,长度小于256字节

aliases和bindings的使用过程:
  1. 先根据aliase{A:B},把字符串A转为字符串B
  2. 再根据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中"."后的也视为标识符,是可以与变量标识符相互覆盖的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值