翻译:图数据库Apache TinkerPop Gremlin图遍历机器和语言

article/2025/10/28 18:49:30

说明

Gremlin是Apache TinkerPop的图形遍历语言。Gremlin是一个功能,数据流 语言,使用户能够简洁地表达复杂的遍历(或查询)的应用程序的性能曲线图。每个Gremlin遍历都由一系列(可能嵌套的)步骤组成。步骤对数据流执行原子操作。每一步都是map步骤(转换流中的对象),filter步骤(从流中移除对象)或sideEffect-step(计算有关流的统计信息)。Gremlin步骤库在这3个基本操作的基础上扩展,为用户提供了丰富的步骤集,用户可以编写这些步骤,以询问他们可能对Gremlin is Turing Complete数据有任何可能的疑问。

场景一

g.V().has("name","gremlin").out("knows").out("knows").values("name")
  1. Gremlin的朋友的朋友的名字是什么?获得名称为“ gremlin”的顶点。
  2. 游历Gremlin认识的人。
  3. 遍历那些认识的人。
  4. 获取这些人的名字。

场景二

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")

两个朋友创建的项目的名称是什么?

  1. …存在一些认识“ b”的“ a”。
  2. …存在创建“ c”的一些“ a”。
  3. …存在创建“ c”的一些“ b”。
  4. …存在一个由2个人创建的“ c”。
  5. 获取所有匹配的“ c”项目的名称。

场景三

g.V().has("name","gremlin").repeat(in("manages")).until(has("title","ceo")).path().by("name")
  1. 让经理从gremlin遍历到首席执行官。
  2. 获得名称为“ gremlin”的顶点。
  3. 遍历管理链…
  4. …直到拥有CEO头衔的人为止。
  5. 获取遍历路径中经理的姓名。

场景四

g.V().has("name","gremlin").as("a").out("created").in("created").where(neq("a")).groupCount().by("title")
  1. 获取Gremlin的合作者之间的标题分配。
  2. 获得名称为“ gremlin”的顶点并将其标记为“ a”。
  3. 获取Gremlin创建的项目,然后由谁创建…
  4. 不是gremlin
  5. 按标题对这些协作者进行分组统计。

场景五

g.V().has("name","gremlin").out("bought").aggregate("stash").in("bought").out("bought").where(not(within("stash"))).groupCount().order(local).by(values,desc)
  1. 获取供Gremlin购买的相关产品的排名列表。
  2. 获得名称为“ gremlin”的顶点。
  3. 获取Gremlin购买的产品并保存为“存储”。
  4. 还有谁买了那些产品,又买了什么…
  5. … Gremlin尚未购买。
  6. 按相关性对产品和订单进行分组计数。

场景六

g.V().hasLabel("person").pageRank().by("friendRank").by(outE("knows")).order().by("friendRank",desc).limit(10)
  1. 在知识图中获得10个最重要的人物。
  2. 获取所有人的顶点。
  3. 使用知识边缘计算其PageRank。
  4. 按他们的friendRank分数排序人。
  5. 获得排名前10位的人。

OLTP和OLAP遍历

Gremlin是根据“编写一次,随处运行”的哲学设计的。这意味着不仅所有启用TinkerPop的图形系统都可以执行Gremlin遍历,而且每个Gremlin遍历都可以评估为实时数据库查询或批处理分析查询。前者被称为在线事务处理Online transaction processing(OLTP),后者被称为在线分析过程Online analytical processing(OLAP)。Gremlin遍历机使这种通用性成为可能。这个基于图形的分布式虚拟机 了解如何协调多机图遍历的执行。而且,不仅执行可以是OLTP或OLAP,遍历的某些子集还可以执行OLTP,而其他子集则可以通过OLAP执行。好处是用户不需要学习数据库查询语言和特定于域的BigData分析语言(例如Spark DSL,MapReduce等)。Gremlin是构建基于图形的应用程序所需的全部,因为Gremlin遍历机将处理其余部分。
在这里插入图片描述

命令式和声明式遍历

Gremlin遍历可以用命令式(过程式),声明式(描述性)方式编写)方式,或同时包含命令式和声明式方面的混合方式。命令式Gremlin遍历告诉遍历者如何在遍历的每个步骤进行。例如,右边的命令式遍历首先在顶点处放置一个遍历器,表示Gremlin。然后,那个遍历者将自己分散到不是Gremlin自己的所有Gremlin合作者中。接下来,遍历者走到那些协作者的经理,最终被归类为经理姓名计数分布。这种遍历是必须的,因为它以一种明确的程序方式告诉遍历者“去这里然后去那里”。

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

声明性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")

用户可以选择任何方式编写遍历。但是,最终在遍历遍历时,并根据基础执行引擎(即OLTP图数据库或OLAP图处理器),将通过一组遍历策略来重写用户的遍历,这些策略将尽力确定最佳执行方式根据对图形数据访问成本以及底层数据系统的独特功能的理解(例如,从图形数据库的“名称”索引中获取Gremlin顶点)进行计划。Gremlin旨在为用户提供表达查询方式的灵活性,并为图形系统提供者提供灵活性,以针对支持TinkerPop的数据系统有效地评估遍历。

宿主语言嵌入

经典的数据库查询语言(例如SQL)被认为与最终在生产环境中使用它们的编程语言根本不同。因此,经典数据库要求开发人员以其本机编程语言以及数据库的相应查询语言进行编码。可以说“查询语言”和“编程语言”之间的差异不如我们所教。Gremlin统一了这种鸿沟,因为遍历可以使用任何支持函数组合和嵌套的编程语言编写(每种主要编程语言都支持)。这样,用户的Gremlin遍历将与应用程序代码一起编写,并受益于宿主语言及其工具(例如,类型检查,语法突出显示,点完成等)提供的优势。存在各种Gremlin语言变体,包括:Gremlin-Java,Gremlin-Groovy,Gremlin-Python, Gremlin-Scala等。
在这里插入图片描述

下面的第一个示例显示了一个简单的Java类。请注意,Gremlin遍历以Gremlin-Java表示,因此是用户应用程序代码的一部分。开发人员无需String用(但)另一种语言创建查询的表示形式,以最终将其传递String给图形计算系统并返回结果集。而是将遍历嵌入到用户的主机编程语言中,并与所有其他应用程序代码同等地位。使用Gremlin,用户不必面对下面第二个示例中所示的尴尬情况,这是整个行业中常见的反模式。

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")}
}

在幕后,Gremlin遍历将针对嵌入式图形数据库进行本地评估,通过网络将其序列化为远程图形数据库,或将其发送给OLAP处理器以进行集群范围的分布式执行。遍历源定义确定遍历在何处执行。一旦定义了遍历源,就可以类似于数据库连接的方式反复使用它。最终的效果是,用户“感觉”到他们的数据和遍历都位于应用程序中,并且可以通过其应用程序的本机编程语言进行访问。“查询语言/编程语言”划分由Gremlin桥接。

Graph graph = GraphFactory.open(...);
GraphTraversalSource g;
g = graph.traversal();                                                         // local OLTP
g = traversal().withRemote(DriverRemoteConnection.using("localhost", 8182))    // remote
g = graph.traversal().withComputer(SparkGraphComputer.class);                 // distributed OLAP

参考

https://tinkerpop.apache.org/gremlin.html


http://chatgpt.dhexx.cn/article/2LRp14g6.shtml

相关文章

html递归遍历,图的深度遍历是一个递归过程

数据结构问题:图的深度优先遍历中有递归的应用,数据结构问题:图的深度优先遍历中有递归的应用,要用到栈,图中顶点是首先你得明白函数调用本身就是通过栈来实现的。 调用函数是入栈,而函数返回是出栈。 为什么是栈, 你要知道栈的特性是 “后进先出”或者是“先进后出”,…

networkx之图遍历和图绘制

networkx之图遍历和图绘制 文章目录 networkx之图遍历和图绘制图数据读取后默认标签(labels)为索引,如何使用编号id?图数据读取后,如何得到节点集和边集?如何绘制多样的图? 图数据读取后默认标签…

python-opencv如何遍历图片

使用背景 一个朋友,需要查看鸡蛋是否有裂纹,如下图所示: 之后通过python-opencv处理成为了如下结果: 如上图所示,通过canny轮廓提取得到了左图所示轮廓,通过阈值分割得到右图所示裂纹,此时需要…

图形的遍历

一个图形G(V,E),存在某一顶点v,希望从v开始,通过此顶点相邻的顶点而去访问G中其他顶点直达全部的顶点遍历完毕。在遍历的过程中可能会重复经过某些顶点及边线,经由图形的遍历可以判断该图形是否连通,并找出连通单元和路…

图遍历详解(C语言版)

文章目录 一、定义二、方法1、深度优先遍历2、广度优先遍历 三、实现1、无向图或强连通有向图遍历2、非连通图遍历 结语附录 一、定义 从给定图中任意指定的顶点(称为初始点)出发,按照某种搜索方法沿着图的边访问图中所有顶点,使每…

记录在遍历数据时,如何将数据的每一项中的个图片遍历出来

场景:商品评价页面,需将每一条评价显示出来,有图片评价的也要将图片显示出来 后端返回的接口数据格式如下: 如果是一张图片,在遍历外层的时候,用item.discuss_img就可以直接显示出来了,但多张图…

小程序轮播图遍历图片的方法

uniapp轮播图组件 方法一&#xff1a;直接使用图片 <swiper :indicator-dots"true" :autoplay"true" :interval"3000" :duration"1000" :circular"true"><swiper-item><image src"/static/swiper_img/…

图遍历算法

上一篇文章中我们简单介绍了什么是图和图分析&#xff0c;图分析的应用场景和优点&#xff0c;以及一些常用的图工具&#xff0c;这篇文章里将介绍一下简单的图遍历算法。 图的遍历 图的遍历是指&#xff0c;从给定图中任意指定的顶点&#xff08;称为初始点&#xff09;出发…

图的遍历(基础)

目录 一、图的遍历的相关定义 二、深度优先搜索 &#xff08;一&#xff09;深度优先搜索连通子图的基本思想 &#xff08;二&#xff09;采用递归的形式说明&#xff0c;则深度优先搜索连通子图的基本思想&#xff1a; &#xff08;三&…

图的遍历(深度优先遍历,DFS)

1.概念 图的遍历操作是从图中某一顶点出发&#xff0c;对图中所有顶点访问一次且仅访问一次 &#xff08;1&#xff09;在图中&#xff0c;遍历的起始顶点是编号最小的顶点 &#xff08;2&#xff09;某个起点到达不了所有顶点&#xff0c;则多次调用访问所有顶点 &#xf…

数据结构 第六章 图——图的遍历

6.5 图的遍历 在前面我们知道&#xff0c;树是一种非线性结构&#xff0c;为了方便它在计算机中的存储&#xff0c;对树进行遍历使它线性化。 而图同样也是一种非线性结构&#xff0c;但是图又是一种不同于树的多对多结构&#xff0c;所以在前面我们将其转换为了多个一对多的结…

数据结构——图(图的遍历)

图的遍历 图的遍历深度优先遍历&#xff08;DFS&#xff09;DFS算法效率分析深度优先遍历算法的实现广度优先搜索遍历&#xff08;BFS&#xff09;BFS算法效率分析DFS与BFS算法比较 图的遍历 遍历定义&#xff1a;从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所…

图的遍历 (深度优先遍历和广度优先遍历)

一. 什么是深度优先遍历 深度优先遍历可定义如下&#xff1a;首先访问出发点v&#xff0c;并将其标记为已访问过&#xff1b;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过&#xff0c;则以w为新的出发点继续进行深度优先遍历&#xff0c;直至图中所有和源点v有路径相通的…

图的遍历

图的遍历 介绍 是从图的某一顶点出发&#xff0c;按照某种搜索方式对图中所有顶点访问一次且仅一次。图的遍历可以解决很多搜索问题&#xff0c;在实际中应用非常广泛。图的遍历根据搜索方式的不同&#xff0c;分为广度优先搜索和深度优先搜索。 一.深度优先遍历 1.1介绍 深…

视频和图片合成软件,简单快速合成视频和图片

怎么把小视频和图片合成起来&#xff1f;有简单好上手的教程吗&#xff1f;今天就教大家简单几步&#xff0c;把视频和图片合成为照片视频。先看看用数码大师合成视频和图片的效果截图&#xff1a; 第一步&#xff1a;把图片一次性导入&#xff0c;为照片配上文字 点击“添加…

多张图片怎么合成gif?

多张图片怎么合成gif&#xff1f;gif动图是我们比较熟悉的一种网络聊天表情包&#xff0c;通常都是由图片或者视频转换而来的。很多小伙伴会选择用PS来制作GIF动图&#xff0c;但并不是所有小伙伴都会使用PS&#xff0c;所以一个自动简单&#xff0c;可以将图片或者视频直接转换…

android将图片做成视频播放,如何把图片做成视频【图文教程】

教你怎么将手机拍摄的一张张图片整合转换成视频播放更唯美。下面以直走婚纱mv电子相册为例。 安装好软件&#xff0c;先运行绿化程序&#xff0c;然后再运行软件&#xff0c;详情请参看使用说明txt文档。打开之后&#xff0c;有两个模式供你选择&#xff0c;左边是标准模式、右…

php把图片合成视频,如何把照片做成视频 照片音乐视频制作 并插入几段短视频片段...

如何把照片制作成视频&#xff1f;相信大家都已经有所耳闻了&#xff0c;把平时手机或者相机上拍摄的照片&#xff0c;还有拍摄的视频都可以合起来&#xff0c;再添加背景音乐就成了一个非常有纪念价值的视频了。然而已经不是只有照片和音乐的视频了&#xff0c;整个视频全是照…

视频转图片-人脸识别-合成视频

视频转图片-人脸识别-合成视频 代码&#xff1a; import cv2 import os,sys import numpy as npface_xml cv2.CascadeClassifier(r"C:\Users\lenovo\Desktop\python\jiqixuexi\haarcascade_frontalface_default.xml") eye_xml cv2.CascadeClassifier(r"C:\U…

怎样用计算机合并视频,电脑视频合并软件 , 怎样把多个视频合成为一个

昨天小编在搜梁博的歌曲《表态》的视频时(这首歌小编觉得真的很好听推荐下)在一个剪辑视频发现他将梁博在某综艺唱的歌曲全都剪辑在视频里。这里就运用到了一个剪辑视频知识&#xff0c;合并视频。既然看到小编就准备跟大家伙讲讲这个视频剪辑内容。如何把多个视频合并在一个视…