图遍历语言

Gremlin简介

Gremlin是Apache TinkerPop
框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户使用轻松的点子表明复杂的性质图(property
graph)的遍历或询问。各个Gremlin遍历由一名目诸多步骤(可能存在嵌套)组成,每一步都在数据流(data
stream)上施行3个原子操作。

Gremlin包蕴四个宗旨的操作:

  • map-step
    对数码流中的靶子进行转移;
  • filter-step
    对数码流中的目的就行过滤;
  • sideEffect-step
    对数码流举行测算总括;

以下是Gremlin在局地景色中的具体运用:

  • 一.查找Gremlin朋友的情人

    g.V().has("name","gremlin").
      out("knows").
      out("knows").
      values("name")
    
  • 2.研究那多少个由四个朋友一起创办的花色

    g.V().match(
      as("a").out("knows").as("b"),
      as("a").out("created").as("c"),
      as("b").out("created").as("c"),
      as("c").in("created").count().is(2)).
    select("c").by("name")
    
  • 3.提交Gremlin的有着上司,直至首席营业官

    g.V().has("name","gremlin").
      repeat(in("manages")).
    until(has("title","ceo")).
      path().by("name")
    
  • 四.赢得Gremlin合营者的头衔布满

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      groupCount().by("title")
    
  • 5.拿走Gremlin购买产品的连锁产品列表并排序

    g.V().has("name","gremlin").
      out("bought").aggregate("stash").
      in("bought").out("bought").
    where(not(within("stash"))).
      groupCount().order(local).by(values,decr)
    
  • 6.得到排行前10的着力人物

    g.V().hasLabel("person").
      pageRank().
    by("friendRank").
    by(outE("knows")).
      order().by("friendRank",decr).
      limit(10)
    

Gremlin简介

Gremlin是Apache TinkerPop
框架下的图遍历语言。Gremlin是1种函数式数据流语言,能够使得用户使用轻巧的措施发挥复杂的品质图(property
graph)的遍历或询问。每一种Gremlin遍历由一密密麻麻步骤(可能存在嵌套)组成,每一步都在数据流(data
stream)上实践一个原子操作。

Gremlin包罗八个主导的操作:

  • map-step
    对数据流中的目的进行调换;
  • filter-step
    对数码流中的靶子就行过滤;
  • sideEffect-step
    对数据流举行总结总计;

以下是Gremlin在局地意况中的具体运用:

  • 1.查找Gremlin朋友的爱侣

    g.V().has("name","gremlin").
      out("knows").
      out("knows").
      values("name")
    
  • 二.搜寻这几个由四个对象合伙创立的体系

    g.V().match(
      as("a").out("knows").as("b"),
      as("a").out("created").as("c"),
      as("b").out("created").as("c"),
      as("c").in("created").count().is(2)).
    select("c").by("name")
    
  • 3.提交Gremlin的持有上司,直至CEO

    g.V().has("name","gremlin").
      repeat(in("manages")).
    until(has("title","ceo")).
      path().by("name")
    
  • 4.到手Gremlin同盟者的头衔分布

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      groupCount().by("title")
    
  • 5.获得Gremlin购买产品的有关制品列表并排序

    g.V().has("name","gremlin").
      out("bought").aggregate("stash").
      in("bought").out("bought").
    where(not(within("stash"))).
      groupCount().order(local).by(values,decr)
    
  • 六.拿走排行前10的为主人物

    g.V().hasLabel("person").
      pageRank().
    by("friendRank").
    by(outE("knows")).
      order().by("friendRank",decr).
      limit(10)
    

OLTP 和 OLAP遍历

  • 一遍编写,随地运转
    Gremlin服从“3回编写,随地运维”的打算农学。那象征不但具备的TinkerPop启用的图形系统都能施行Gremlin遍历,而且每一种Gremlin遍历都足以被评估为实时数据库查询或批管理查询。(前者被称作在线交易流程(OLTP),后者被号称在线分析流程(OLAP))。

  • 和睦多种图遍历
    那种广泛性是由Gremlin遍历机落成的。那种布满式、基于图形的虚拟机领悟什么和睦多机器图遍历的执行。好处是,用户不须求上学数据库查询语言和域特定的BigData分析语言(比如SparkDSL,MapReduce等)。Gremlin是创设基于图的应用程序所必需的,别的全数都付出Gremlin遍历机管理。
    ca88官方会员登录 1

OLTP 和 OLAP遍历

  • 二遍编写,随处运营
    Gremlin遵从“2次编写,随处运营”的规划工学。那表示不但抱有的TinkerPop启用的图形系统都能进行Gremlin遍历,而且每种Gremlin遍历都可以被评估为实时数据库查询或批管理查询。(前者被称呼在线交易流程(OLTP),后者被称之为在线分析流程(OLAP))。

  • 和睦八种图遍历
    那种布满性是由Gremlin遍历机完成的。那种布满式、基于图形的虚拟机通晓怎么和煦多机器图遍历的施行。好处是,用户不须要学习数据库查询语言和域特定的BigData分析语言(比方斯ParkerDSL,MapReduce等)。Gremlin是创设基于图的应用程序所必备的,其他全体都交由Gremlin遍历机管理。
    ca88官方会员登录 2

命令式和注解式遍历

Gremlin遍历能够以命令式(程序式)格局,证明性(描述性)情势编写,也得以分包命令性和申明性的插花方式编写。

  • 命令式编写格局
    得到Gremlin合营者的上司名字分布:

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      in("manages").
      groupCount().by("name")
    

    贰个命令式的Gremlin遍历告诉运转器如何执行遍历中的每一步;然后,遍历器差异到具备的“Gremlin”的协小编(去除Gremlin自己);下一步,遍历器走到“Gremlin”合营者的上级(managers),最后基于上边的名字进行总括分发。

于是是命令式的Gremlin遍历,正是它明确地、程序化地报告遍历器“去那里,然后去那边”。

  • 评释式编写方式
    以下使用证明式编写格局落成了一致的结果:

    g.V().match(
      as("a").has("name","gremlin"),
      as("a").out("created").as("b"),
      as("b").in("created").as("c"),
      as("c").in("manages").as("d"),
    where("a",neq("c"))).
      select("d").
      groupCount().by("name")
    

    申明式的Gremlin遍历并不能够告诉遍历器推行它们的步骤的依次,而是允许各样遍历器从2个(恐怕嵌套的)形式的聚众中挑选1个格局来进行。

可是,注明遍历具有额外的补益,它不但使用了编写翻译时查询安插器(如命令式遍历),而且依然一个运维时查询安排器,遵照每一种方式的历史总结新闻选取下一个进行哪个遍历情势

  • 惠及那2个倾向于减少/过滤大大部分据的格局。

用户能够选取上述提议的点子编写自身的遍历语句。不管怎么着,用户的遍历语句都会依赖现实的实践引擎和遍历计策traversal
strategies
被重写。Gremlin为用户提供灵活性表明自身的查询的;图系统也针对具体启用TinkerPop的数据系统举办有效地评估图遍历提供了灵活性。

命令式和表明式遍历

Gremlin遍历能够以命令式(程序式)格局,注明性(描述性)方式编写,也得以分包命令性和证明性的插花格局编写。

  • 命令式编写格局
    赢得Gremlin同盟者的上级名字布满:

    g.V().has("name","gremlin").as("a").
      out("created").in("created").
    where(neq("a")).
      in("manages").
      groupCount().by("name")
    

    三个命令式的Gremlin遍历告诉运转器怎么着实践遍历中的每一步;然后,遍历器分化到持有的“Gremlin”的合营方(去除Gremlin本人);下一步,遍历器走到“Gremlin”协笔者的上级(managers),末了根据上级的名字实行总结分发。

因而是命令式的Gremlin遍历,便是它明显地、程序化地告知遍历器“去那里,然后去那里”。

  • 表明式编写情势
    以下使用申明式编写方式贯彻了同样的结果:

    g.V().match(
      as("a").has("name","gremlin"),
      as("a").out("created").as("b"),
      as("b").in("created").as("c"),
      as("c").in("manages").as("d"),
    where("a",neq("c"))).
      select("d").
      groupCount().by("name")
    

    申明式的Gremlin遍历并不能告诉遍历器实行它们的步调的一壹,而是允许各样遍历器从五个(大概嵌套的)情势的汇集中采取四个方式来实行。

但是,声明遍历具备额外的裨益,它不仅仅利用了编写翻译时查询陈设器(如命令式遍历),而且依旧二个运作时查询安排器,依照各类方式的野史总计音讯采取下2个实行哪个遍历情势

  • 造福那个倾向于减少/过滤大好多数额的形式。

用户能够选拔上述提议的主意编写本身的遍历语句。不管如何,用户的遍历语句都会依据实际的施行引擎和遍历战术traversal
strategies
被重写。Gremlin为用户提供灵活性表明自己的询问的;图系统也针对实际启用TinkerPop的数据系统实行实用地评估图遍历提供了灵活性。

无缝嵌入主语言

  • 会集主开垦语言和图查询语言
    杰出数据库查询语言(如SQL)被认为与最终在生养条件中选用的编制程序语言天壤悬隔。由此,优良数据库要求开采人士既要编写主编程语言,还要编写数据库相应的询问语言。Gremlin统一了那几个划分,因为遍历能够用帮忙功能结合和嵌套(首要编制程序语言都扶助)的其余编程语言编写。由此,用户的Gremlin遍历可以使用应用程序语言(主语言,Host
    language)编写,并受益于主语言及其工具(举例类型检查,语法高亮,点成就等)所提供的长处。近日设有种种Gremlin语言变体,包蕴:Gremlin-Java,Gremlin-Groovy,Gremlin-Python,Gremlin-Scala等。

  • ca88官方会员登录,演示程序
    相比较之下三种方式,高低立判:

    public class GremlinTinkerPopExample {
      public void run(String name, String property) {
    
    Graph graph = GraphFactory.open(...);
    GraphTraversalSource g = graph.traversal();
    
    double avg = g.V().has("name",name).
                   out("knows").out("created").
                   values(property).mean().next();
    
    System.out.println("Average rating: " + avg);
      }
    }
    

public class SqlJdbcExample {
  public void run(String name, String property) {

    Connection connection = DriverManager.getConnection(...)
    Statement statement = connection.createStatement();
    ResultSet result = statement.executeQuery(
      "SELECT AVG(pr." + property + ") as AVERAGE FROM PERSONS p1" +
        "INNER JOIN KNOWS k ON k.person1 = p1.id " +
        "INNER JOIN PERSONS p2 ON p2.id = k.person2 " +
        "INNER JOIN CREATED c ON c.person = p2.id " +
        "INNER JOIN PROJECTS pr ON pr.id = c.project " +
          "WHERE p.name = '" + name + "');

    System.out.println("Average rating: " + result.next().getDouble("AVERAGE")
  }
}

无缝嵌入主语言

  • 联合主开采语言和图查询语言
    卓绝数据库查询语言(如SQL)被认为与最终在生育条件中应用的编制程序语言相去甚远。由此,杰出数据库供给开荒职员既要编写主编程语言,还要编写数据库相应的询问语言。Gremlin统一了那一个划分,因为遍历能够用协理成效整合和嵌套(重要编程语言都帮助)的其余编制程序语言编写。因而,用户的Gremlin遍历可以运用应用程序语言(主语言,Host
    language)编写,并收益于主语言及其工具(举例类型检查,语法高亮,点到位等)所提供的长处。近年来留存各类Gremlin语言变体,蕴含:Gremlin-Java,Gremlin-Groovy,Gremlin-Python,Gremlin-Scala等。

  • 示范程序
    相比之下二种格局,高低立判:

    public class GremlinTinkerPopExample {
      public void run(String name, String property) {
    
    Graph graph = GraphFactory.open(...);
    GraphTraversalSource g = graph.traversal();
    
    double avg = g.V().has("name",name).
                   out("knows").out("created").
                   values(property).mean().next();
    
    System.out.println("Average rating: " + avg);
      }
    }
    

public class SqlJdbcExample {
  public void run(String name, String property) {

    Connection connection = DriverManager.getConnection(...)
    Statement statement = connection.createStatement();
    ResultSet result = statement.executeQuery(
      "SELECT AVG(pr." + property + ") as AVERAGE FROM PERSONS p1" +
        "INNER JOIN KNOWS k ON k.person1 = p1.id " +
        "INNER JOIN PERSONS p2 ON p2.id = k.person2 " +
        "INNER JOIN CREATED c ON c.person = p2.id " +
        "INNER JOIN PROJECTS pr ON pr.id = c.project " +
          "WHERE p.name = '" + name + "');

    System.out.println("Average rating: " + result.next().getDouble("AVERAGE")
  }
}

参考资料

The Gremlin Graph Traversal Machine and
Language

参考资料

The Gremlin Graph Traversal Machine and
Language

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图