欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HugeGraph图数据库之Gremlin Job规则

程序员文章站 2022-06-12 10:12:00
...

异步任务:

  • 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中"."后的也视为标识符,是可以与变量标识符相互覆盖的

相关标签: 图数据库