Gremlin:图遍历语言

无缝嵌入主语言

  • 联合主开发语言和图查询语言
    经典数据库查询语言(如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") }}

无缝嵌入主语言

  • 集合主开发语言和图查询语言
    经典数据库查询语言(如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") }}

OLTP 和 OLAP遍历

  • 一回编写,到处运行
    Gremlin遵从“一遍编写,到处运行”的计划性理学。这表示不但所有的TinkerPop启用的图形系统都能履行Gremlin遍历,而且每个Gremlin遍历都足以被评估为实时数据库查询或批处理查询。(前者被誉为在线交易流程(OLTP),后者被喻为在线分析流程(OLAP))。

  • 协调多种图遍历
    这种普遍性是由Gremlin遍历机实现的。这种分布式、基于图形的虚拟机了解哪些协调多机器图遍历的举办。好处是,用户不需要学习数据库查询语言和域特定的BigData分析语言(例如斯帕克(Spark)(Spark)DSL,MapReduce等)。Gremlin是构建基于图的应用程序所必备的,此外全部都提交Gremlin遍历机处理。
    哲学 1

参考资料

The Gremlin Graph Traversal Machine and
Language

Gremlin简介

Gremlin是Apache TinkerPop
框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户拔取简单的办法表明复杂的属性图(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")
  • 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")
  • 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)
  • 6.取得名次前十的骨干人物

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

Gremlin简介

Gremlin是Apache TinkerPop
框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户使用简单的主意发挥复杂的属性图(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")
  • 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")
  • 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)
  • 6.取得名次前十的主导人物

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

命令式和表明式遍历

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遍历并不可以告诉遍历器执行它们的步骤的次第,而是允许每个遍历器从一个(可能嵌套的)情势的聚众中甄选一个形式来施行。

而是,阐明遍历具有额外的功利,它不光利用了编译时查询计划器(如命令式遍历),而且如故一个运转时查询计划器,遵照每个形式的野史总结信息采纳下一个实施哪个遍历格局

  • 有利这个倾向于缩短/过滤大多数数目的形式。

用户可以挑选上述指出的方法编写自己的遍历语句。不管怎么着,用户的遍历语句都会基于具体的施行引擎和遍历策略traversal
strategies
被重写。Gremlin为用户提供灵活性表达自己的查询的;图系统也针对现实启用TinkerPop的数据系统举行有效地评估图遍历提供了灵活性。

OLTP 和 OLAP遍历

  • 四遍编写,到处运行
    Gremlin听从“一次编写,到处运行”的统筹艺术学。这表示不但所有的TinkerPop启用的图形系统都能进行Gremlin遍历,而且每个Gremlin遍历都可以被评估为实时数据库查询或批处理查询。(前者被称呼在线交易流程(OLTP),后者被称之为在线分析流程(OLAP))。

  • 和谐多种图遍历
    这种普遍性是由Gremlin遍历机实现的。这种分布式、基于图形的虚拟机通晓怎么协调多机器图遍历的执行。好处是,用户不需要学习数据库查询语言和域特定的BigData分析语言(例如Spark(Spark)DSL,MapReduce等)。Gremlin是构建基于图的应用程序所不可或缺的,其余所有都交给Gremlin遍历机处理。
    哲学 2

参考资料

The Gremlin Graph Traversal Machine and
Language

命令式和表明式遍历

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遍历并不可能告诉遍历器执行它们的步子的顺序,而是允许每个遍历器从一个(可能嵌套的)格局的会面中选择一个情势来举行。

然则,注明遍历具有额外的便宜,它不仅仅采取了编译时查询计划器(如命令式遍历),而且仍然一个运作时查询计划器,依照每个形式的野史总结音讯拔取下一个执行哪个遍历格局

  • 造福那么些倾向于减弱/过滤大多数数量的情势。

用户可以挑选上述指出的措施编写自己的遍历语句。不管如何,用户的遍历语句都会基于具体的施行引擎和遍历策略traversal
strategies
被重写。Gremlin为用户提供灵活性表达自己的查询的;图系统也针对现实启用TinkerPop的数据系统举办有效地评估图遍历提供了灵活性。

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。