Gremlin Query Language

Gremlin是JanusGraph的查询语言,用于从图形中检索数据和修改数据。Gremlin是一种面向路径的语言,它简洁地表达了复杂的图遍历和变异操作。Gremlin是一种函数语言,遍历操作符被链接在一起形成类似路径的表达式。例如,“从赫拉克勒斯出发,遍历到他父亲,然后是他父亲的父亲,并返回祖父的名字。”

Gremlin是ApacheTingerpop的一个组件。它是独立于JanuGraph开发的,并且大多数图形数据库都支持它。通过使用Gremlin查询语言在JanusGraph之上构建应用程序,用户避免供应商锁定,因为他们的应用程序可以迁移到支持Gremlin的其他图形数据库。

本节简要概述了Gremlin查询语言。有关Gremlin的更多信息,请参阅以下资源:

  • Practical Gremlin:Kelvin R.的在线书籍。劳伦斯对格雷姆林宫进行了深入的概述,并介绍了它与JanusGraph的交互。
  • Complete Gremlin Manual:所有Gremlin步骤的参考手册。
  • Gremlin Console Tutorial:学习如何有效地使用Gremlin控制台以交互方式遍历和分析图形。
  • Gremlin Recipes:小精灵的最佳实践和常见遍历模式的集合。
  • Gremlin Language Drivers:使用不同的编程语言连接到Gremlin服务器,包括Go、JavaScript、.NET/C#、PHP、Python、Ruby、Scala和TypeScript。
  • Gremlin Language Variants:学习如何在宿主编程语言中嵌入Gremlin。
  • Gremlin for SQL developers:使用SQL查询数据时发现的典型模式学习Gremlin。

除了这些资源之外,连接到JanusGraph还解释了Gremlin如何在不同的编程语言中用于查询JanusGraph服务器。

介绍 遍历

Gremlin查询是从左到右计算的操作/函数链。下面提供了一个简单的祖父查询,在入门中讨论的goods数据集的图形上。

gremlin> g.V().has('name', 'hercules').out('father').out('father').values('name')
==>saturn

以上查询可以阅读:

  1. g:对于当前图形遍历。
  2. V:对于图中的所有顶点
  3. has(‘name’,‘hercules’):将顶点过滤到具有name属性“hercules”的顶点(只有一个)。
  4. out(‘father’):从赫拉克勒斯穿过传出的父边。
  5. 'out(‘father’)`:从赫拉克勒斯的父顶点(即木星)遍历传出的父边。
  6. name:获取“hercules”顶点的祖父的name属性。

综合起来,这些步骤形成了一个类似路径的遍历查询。每一步都可以分解并展示其结果。这种构建遍历/查询的方式在构建更大、更复杂的查询链时非常有用。

gremlin> g
==>graphtraversalsource[janusgraph[cql:127.0.0.1], standard]
gremlin> g.V().has('name', 'hercules')
==>v[24]
gremlin> g.V().has('name', 'hercules').out('father')
==>v[16]
gremlin> g.V().has('name', 'hercules').out('father').out('father')
==>v[20]
gremlin> g.V().has('name', 'hercules').out('father').out('father').values('name')
==>saturn

对于健全性检查,通常最好查看每个返回的属性,而不是指定的长id。

gremlin> g.V().has('name', 'hercules').values('name')
==>hercules
gremlin> g.V().has('name', 'hercules').out('father').values('name')
==>jupiter
gremlin> g.V().has('name', 'hercules').out('father').out('father').values('name')
==>saturn

注意相关的遍历,它显示了赫拉克勒斯的整个父系树分支。提供这种更复杂的遍历是为了展示语言的灵活性和表达能力。熟练掌握Gremlin为JanusGraph用户提供了流畅地浏览底层图形结构的能力。

gremlin> g.V().has('name', 'hercules').repeat(out('father')).emit().values('name')
==>jupiter
==>saturn

下面提供了更多的遍历示例。

gremlin> hercules = g.V().has('name', 'hercules').next()
==>v[1536]
gremlin> g.V(hercules).out('father', 'mother').label()
==>god
==>human
gremlin> g.V(hercules).out('battled').label()
==>monster
==>monster
==>monster
gremlin> g.V(hercules).out('battled').valueMap()
==>{name=nemean}
==>{name=hydra}
==>{name=cerberus}

每一步(用分隔符号表示)都是一个函数,它对上一步发出的对象进行操作。在Gremlin语言中有许多步骤(参见Gremlin步骤)。通过简单地改变一个步骤或步骤的顺序,就可以实现不同的遍历语义。下面的例子返回与赫拉克勒斯同一怪物作战的所有人的名字,这些怪物本身不是赫拉克勒斯(即“共同作战者”或者“盟友”)。

假设神的图形只有一个战斗者(大力神),另一个战斗者(为了举例)被添加到图形中,Gremlin展示了如何将顶点和边添加到图形中。

gremlin> theseus = graph.addVertex('human')
==>v[3328]
gremlin> theseus.property('name', 'theseus')
==>null
gremlin> cerberus = g.V().has('name', 'cerberus').next()
==>v[2816]
gremlin> battle = theseus.addEdge('battled', cerberus, 'time', 22)
==>e[7eo-2kg-iz9-268][3328-battled->2816]
gremlin> battle.values('time')
==>22

添加顶点时,可以提供可选的顶点标签。添加边时必须指定边标签。可以在顶点和边上设置作为键值对的属性。使用集合或列表基数定义属性键时,向顶点添加相应属性时必须使用addProperty。

gremlin> g.V(hercules).as('h').out('battled').in('battled').where(neq('h')).values('name')
==>theseus

上面的示例有4个链接函数:out、in、exceptive和value(即name是value(‘name’)的缩写)。每个函数的签名都在下面逐项列出,其中V是顶点,U是任意对象,其中V是U的子集。

  1. out: V -> V
  2. in: V -> V
  3. except: U -> U
  4. values: V -> U

将函数链接在一起时,传入类型必须与传出类型匹配,其中U匹配任何内容。因此,上面的“协同作战/盟军”遍历是正确的。

Note

本节介绍的Gremlin概述主要关注Gremlin控制台中使用的gremlingroovy语言实现。请参阅连接到JanusGraph,了解有关使用Groovy以外的其他语言和独立于Gremlin控制台连接到JanusGraph的信息。

迭代遍历

Gremlin控制台的一个方便的特性是,它自动迭代从Gremlin>提示符执行的查询的所有结果。这在REPL环境中运行良好,因为它将结果显示为字符串。当您过渡到编写Gremlin应用程序时,了解如何显式迭代遍历非常重要,因为应用程序的遍历不会自动迭代。以下是迭代遍历的一些常见方法:

  • iterate()-预期结果为零或可以忽略。
  • next()-得到一个结果。确保先选中hasNext()。
  • next(int n)-获取next n个结果。确保先选中hasNext()。
  • toList()-以列表形式获取所有结果。如果没有结果,则返回一个空列表。

下面显示了一个Java代码示例来演示这些概念:

Traversal t = g.V().has("name", "pluto"); // Define a traversal
// Note the traversal is not executed/iterated yet
Vertex pluto = null;
if (t.hasNext()) { // Check if results are availablepluto = g.V().has("name", "pluto").next(); // Get one resultg.V(pluto).drop().iterate(); // Execute a traversal to drop pluto from graph
}
// Note the traversal can be cloned for reuse
Traversal tt = t.asAdmin().clone();
if (tt.hasNext()) {System.err.println("pluto was not dropped!");
}
List<Vertex> gods = g.V().hasLabel("god").toList(); // Find all the gods

JanusGraph对于Gremlin查询语言的介绍相关推荐

  1. Gremlin 查询语言

    Gremlin是 JanusGraph 的查询语言,用于从图中检索数据和修改数据.Gremlin 是一种面向路径的语言,它简洁地表达了复杂的图遍历和变异操作.Gremlin 是一种函数式语言,其中遍历 ...

  2. 6. Gremlin查询语言

    Gremlin是JanusGraph的查询语言,用于从图中检索数据和更新数据. Gremlin是一种面向路径的语言,它能够简洁地表示复杂的图形遍历和多步操作.Gremlin是一种函数式语言,遍历运算被 ...

  3. SQL(结构化查询语言)介绍

    (一).SQL是一种非过程性语言.例如:它描述了如何对数据进行检索.插入.删除,但他并不说明如何进行这样操作. (二).RDBMS–关系型数据库管理系统 (三).数据库–按照我们的意愿来存储和处理这些 ...

  4. 图数据库JanusGraph实战[6]: JanusGraph+HBase+ElasticSearch的环境搭建

    图数据库JanusGraph实战[6]: JanusGraph+HBase+ElasticSearch的环境搭建 作者:胡佳辉(家辉)  日期:2019年01月14日 CSDN博客:https://b ...

  5. 知识图谱 数据模型和查询语言

    文章目录 1. RDF图数据模型 1.1 资源描述框架RDF 1.2 RDF图数据模型 1.3 RDF Schema(简称RDFS) 2.SPARQL查询语言 2.1 SPARQL 语法 2.2 SP ...

  6. 图解图库JanusGraph系列-解惑图数据库,你知道什么是图数据库吗?

    解惑图数据库!你知道什么是图数据库吗? 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 整理所有图相关文章,请移步(超链):图数据库系列-文章总目录 地址:htt ...

  7. Cypher查询语言

    背景介绍 属性图模型以及其上的Cypher查询语言最早定义于著名的图数据库系统--Neo4j.Neo4j是由Neo4j公司开发的图数据库系统,其起源于2000年Neo4j的创始人开发的多媒体资产管理系 ...

  8. 「JanusGraph」图形数据库 - 技术选型调研

    JanusGraph各组件版本兼容性匹配表 JanusGraph JanusGraph提供多种后端存储和后端索引,使其能够更灵活的部署.本章介绍了几种可能的部署场景,以帮助解决这种灵活性带来的复杂性. ...

  9. JanusGraph服务器

    JanusGraph 服务器 JanusGraph使用Gremlin服务器引擎作为服务器组件来处理和回答客户机查询.当封装在JanusGraph中时,Gremlin服务器称为JanusGraph服务器 ...

  10. 【JanusGraph】第七章:JanusGraph服务

    JanusGraph使用Gremlin Server作为服务组件对客户端请求进行请求处理响应.当JanusGraph打包的时候,Gremlin Server就被称为JanusGraph服务. Janu ...

最新文章

  1. html 图片时钟,教你五步制作精美的HTML时钟
  2. Ubuntu 关机,重启,注销命令
  3. Zookeeper分布式一致性原理(七):Curator客户端
  4. sed命令的使用和说明
  5. /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc 文件的作用
  6. c语言转图形化,「分享」C语言如何编写图形界面
  7. Android vlc 分析视频,VLC-Android 对视频流(RTSP)做翻转、旋转
  8. HOW TO: Troubleshoot development errors in MOSS 2007
  9. laravel-admin 使用记录(1) - 安装
  10. 超链接一般有两种表现形式_外链的三种常见表现形式
  11. 3804. 构造字符串-AcWing题库
  12. JVM-深入虚拟机字节码执行引擎
  13. ASEMI整流桥S25VB100,S25VB100参数,S25VB100应用
  14. 阶梯博弈(Staircase Nim)
  15. 实体-关系联合抽取:Incremental Joint Extraction of Entity Mentions and Relations
  16. 【Centos 7】---vim环境配色(colorscheme)配置
  17. Hive 3.x详细笔记
  18. python 如何绘制分叉图
  19. [opencv] BF匹配器和Flann匹配器
  20. 大话php设计模式视频,大话PHP设计模式【1】 – 魔术师之路

热门文章

  1. javaw.exe与java.exe_java.exe和javaw.exe的区别及使用方法
  2. 如何在EDEM中添加颗粒的bond
  3. Android 开发框架xUtils3
  4. 华为路由器 dopra linux passwd,使用华为光猫ONT使能工具后,本地主机如何通过Telnet登录光猫进行配置...
  5. 1319 移棋子游戏(sg函数模板)
  6. 人机大战!人工智能轻松打败美国空军
  7. 支付接口申请_微信小程序商城如何开通支付功能
  8. 有道 - 扇贝 - 海词词典发音链接
  9. MySQL 通过 jemalloc 管理内存
  10. 苹果电脑上四款好用的可以记事的日历软件