Gremlin:图遍历语言

article/2025/10/7 18:48:33

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的所有上司,直至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)
  • 6.获取排名前十的中心人物
g.V().hasLabel("person").pageRank().by("friendRank").by(outE("knows")).order().by("friendRank",decr).limit(10)

OLTP 和 OLAP遍历

  • 一次编写,到处运行
    Gremlin遵循“一次编写,到处运行”的设计哲学。这意味着不仅所有的TinkerPop启用的图形系统都能执行Gremlin遍历,而且每个Gremlin遍历都可以被评估为实时数据库查询或批处理查询。(前者被称为在线交易流程(OLTP),后者被称为在线分析流程(OLAP))。

  • 协调多种图遍历
    这种普遍性是由Gremlin遍历机实现的。这种分布式、基于图形的虚拟机了解如何协调多机器图遍历的执行。好处是,用户不需要学习数据库查询语言和域特定的BigData分析语言(例如Spark DSL,MapReduce等)。Gremlin是构建基于图的应用程序所必要的,其余一切都交给Gremlin遍历机处理。
    775861-20171025102949207-591132604.png

命令式和声明式遍历

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的数据系统进行有效地评估图遍历提供了灵活性。

无缝嵌入主语言

  • 统一主开发语言和图查询语言
    经典数据库查询语言(如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

转载于:https://www.cnblogs.com/myitroad/p/7727570.html


http://chatgpt.dhexx.cn/article/S4b5pf9E.shtml

相关文章

TWR双边测距

本篇承接UWB那篇,专门介绍下双边测距的原理。 1.单侧双边测距 如上图所示,设备A发起交换,设备B响应完成交换,每个设备精确地记录发送和接收时间戳信息。设备B在收到设备A的信号后,延迟固定的时间回发信号&#xff0…

Java 7 - TWR 和 多异常捕获 示例

为什么80%的码农都做不了架构师?>>> package interview.blob_clob;import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared…

TWR_MPC8309调试日志

版权声明:本文为博主原创文章,未经博主允许不得转载。 TWR_MPC8309调试日志 --------By Moresung Chan , At 12:00 ,Sep 16,2012 一、软硬件: PC机操作系统:Microsoft Windows Server 2003 R2 开发板:TWR_MPC8309、…

DWM1000 测距原理简单分析 之 SS-TWR代码分析2 -- [蓝点无限]

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 首先将SS 原理介绍中的图片拿过来,将图片印在脑海里。 对于DeviceA 和 DeviceB来说,初始化代码都一样,而后面部分…

Java 处理资源的try语句 (try-with-resources, TWR)

JAVA中try块的标准形式很通用,但有些常见的情况需要开发者小心编写catch和finally块。这些情况是清理或关闭不再需要使用的资源。 正常情况下,我们用try-catch-finally语句来实现打开文件资源,最后再关闭清理文件资源。例如下面的代码&#…

DWM1000 测距原理简单分析 之 SS-TWR

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: DWM1000 超宽带测距,使用的TOF(time of fly) 的方式,也就是计算无线电磁波传输时间,通过传输的时间换算成距离。 电磁波传输速率和光速一样,速度是299792.458km/s,可参见百度百…

完成“LPS node 与Crazyflie在TWR协议下的成功双向测距”实现心路历程总结

完成“LPS node 与Crazyflie在TWR协议下的成功双向测距”实现心路历程总结 1.初识TWR协议2. TWR进阶1.03.TWR协议进阶2.04.TWR协议进阶3.05.TWR协议进阶4.06.总结 说来惭愧,这一点点东西做了快3个月[手动狗头.jpg] 但是这个协议的深入学习让我真正认识到研究生该怎样…

惠普台式机EliteDesk TWR安装双系统

关于HP EliteDesk 800 G4 TWR安装双系统 磁盘分区BIos界面操作Linux系统安装 由于需要在Linux系统下跑ros,但电脑有安装win10系统,为了不破坏Win10系统内的资料,所以就选择安装双系统,根据我之前的安装经验,装个双系统…

24C02 Twr

连续写24C02,只有第一次能够成功,后面写都失败了。这次调整写的时间间隔。调成了5ms,才成功。 查看datasheet,发现有一个tWR参数。表示写的最小时间间隔。这个时间应该是内部写入所需要的时间,如果连续写的时间过短,就会失败。 但…

DWM1000 测距原理简单分析 之 SS-TWR代码分析1 -- [蓝点无限]

蓝点DWM1000 模块已经打样测试完毕,有兴趣的可以申请购买了,更多信息参见 蓝点论坛 正文: 这一篇内容主要是通过官方源码理解SS-TWR 细节 代码下载链接:https://download.csdn.net/download/duanfei255/10787882 所有代码使用方法:复制example 中的main.c到Keil MDK工…

UWB定位算法比较TDOA和TWR究竟哪个好

使用UWB技术进行定位时,有两种基本定位算法:基于差分飞行时间(TDOA)和双向测距(TWR)的UWB定位算法,这两种算法各有优劣,下面将进行比较。 超宽带是一种可用于室内定位的短距离无线电…

HP EliteDesk 880 G2 TWR无法从U盘启用

一、客户需求 客户一台HP EliteDesk 880 G2 TWR台式机,想更换一块固态盘,于是即到哥带了一块固态盘上门给客户更换固态盘,重新安装系统。 更换完固态盘后,准备重新给客户安装系统。 客户的台式机型号是:HP EliteDesk …

java TWR是怎么优雅我们的代码的?

我们在编写IO代码的时候,有的时候真的是对对java IO那种模板化的代码感到厌倦,而且写出来的代码,很臃肿丑陋。像下面这样的代码: public void readFile(String filePath) {FileInputStream fis null;InputStreamReader inReader …

基于UWB的室内SDS_TWR测距算法优化和定位算法融合的研究

1、内容简介 略257 2、内容说明 1、RSSI定位方法 基于接收信号强度RSS(Receive Signal Strength)[57]方法通过三个及以上己知位置的锚节点来测量移动节点发射的信号场强强度,从而通过己有的传播损耗模型来估算移动节点距锚节点的距离,从而实现位置测量…

UWB-DW1000的TWR测距及代码(五)

UWB测距过程很简单,两个设备(A和B)。设备A先发送,设备B等待接收 设备A 发送 P 给 设备B,此时读取时间戳,也可以等收到应答再进行读取,发送时间戳和接收时间戳都会保留最新一次,只要…

UWB DW1000 TWR测距定位功能实现

3基站对1标签进行测距的流程如下: 1、标签发起测距poll,等待3个基站的回应resp;依次收到3个基站的resp后,发送携带时间戳的final; 2、基站等待poll;收到poll后,发送resp,再继续等待…

hp 800 g4 twr linux,【拆机】HP EliteDesk 800 G4 TWR—探究塔式机箱的秘密

惠普商务台式机在专业领域口碑一直强势,其优良的结构设计与出色的稳定性素来为用户所青睐。今天的拆机要为大家带来的是——HP EliteDesk 800 G4 TWR。这款商务台式机内部做工到底如何?今天我就为大家带来答案。 按照惯例先为大家介绍一下这款产品的外观。 作为一台商务台式机…

uwb最详细的DS-TWR测距

简介 •测距、定位和数据传输。 •利用双向测距(TOF)测量或单向到达时间差(TDOA)到达时间差,误差在10cm,经过一定的滤波可以达到更低。 •跨越 3.5 GHz 至 6.5 GHz 的 6 个 RF 频段。 •支持 110 kbps&…

DRAM知识整理系列(三):部分时序参数整理

目录 一、时序参数整理 第一时序: 1、tCL - CAS Lantency Control 2、tRCD - RAS to CAS Delay 3、tRP - Row Precharge Timing 4、tRAS - RAS Active Time 第二时序: 5、CWL - CAS Write Latency 6、tRC - Row Cycle Time 7、tRFC - Row Refr…

超宽带(UWB)学习笔记——TWR测距

文章目录 前言1. 单边双向测距(SS-TWR, Single Side - Two Way Ranging)1.1 测距方式1.2 误差分析 2 双边双向测距(DS-TWR, Double Side - Two Way Ranging)2.1 测距方式2.2 误差分析 参考文献 前言 TOF(Time Of Figh…