从零开始Gremlin学习

article/2025/10/7 18:27:11

从零开始Gremlin学习

创建schema和图

以下面这个ThinkerPop关系图为例
Thinkerpop关系图
在建图之前,首先需要创建schema,创建的schema有属性、节点、和边缘,正常情况下是按照属性->节点->边缘,因为在定义及节点label的时候需要有属性,在定义边缘label的时候需要原节点,目标节点和属性的。

// PropertyKey
graph.schema().propertyKey("name").asText().ifNotExist().create()
graph.schema().propertyKey("age").asInt().ifNotExist().create()
graph.schema().propertyKey("addr").asText().ifNotExist().create()
graph.schema().propertyKey("lang").asText().ifNotExist().create()
graph.schema().propertyKey("tag").asText().ifNotExist().create()
graph.schema().propertyKey("weight").asFloat().ifNotExist().create()// VertexLabel
graph.schema().vertexLabel("person").properties("name", "age", "addr", "weight").useCustomizeStringId().ifNotExist().create()
graph.schema().vertexLabel("software").properties("name", "lang", "tag", "weight").primaryKeys("name").ifNotExist().create()
graph.schema().vertexLabel("language").properties("name", "lang", "weight").primaryKeys("name").ifNotExist().create()// EdgeLabel
graph.schema().edgeLabel("knows").sourceLabel("person").targetLabel("person").properties("weight").ifNotExist().create()
graph.schema().edgeLabel("created").sourceLabel("person").targetLabel("software").properties("weight").ifNotExist().create()
graph.schema().edgeLabel("contains").sourceLabel("software").targetLabel("software").properties("weight").ifNotExist().create()
graph.schema().edgeLabel("define").sourceLabel("software").targetLabel("language").properties("weight").ifNotExist().create()
graph.schema().edgeLabel("implements").sourceLabel("software").targetLabel("software").properties("weight").ifNotExist().create()
graph.schema().edgeLabel("supports").sourceLabel("software").targetLabel("language").properties("weight").ifNotExist().create()// TinkerPop
okram = graph.addVertex(T.label, "person", T.id, "okram", "name", "Marko A. Rodriguez", "age", 29, "addr", "Santa Fe, New Mexico", "weight", 1)
spmallette = graph.addVertex(T.label, "person", T.id, "spmallette", "name", "Stephen Mallette", "age", 0, "addr", "", "weight", 1)tinkerpop = graph.addVertex(T.label, "software", "name", "TinkerPop", "lang", "java", "tag", "Graph computing framework", "weight", 1)
tinkergraph = graph.addVertex(T.label, "software", "name", "TinkerGraph", "lang", "java", "tag", "In-memory property graph", "weight", 1)
gremlin = graph.addVertex(T.label, "language", "name", "Gremlin", "lang", "groovy/python/javascript", "weight", 1)okram.addEdge("created", tinkerpop, "weight", 1)
spmallette.addEdge("created", tinkerpop, "weight", 1)okram.addEdge("knows", spmallette, "weight", 1)tinkerpop.addEdge("define", gremlin, "weight", 1)
tinkerpop.addEdge("contains", tinkergraph, "weight", 1)
tinkergraph.addEdge("supports", gremlin, "weight", 1)// Titan
dalaro = graph.addVertex(T.label, "person", T.id, "dalaro", "name", "Dan LaRocque ", "age", 0, "addr", "", "weight", 1)
mbroecheler = graph.addVertex(T.label, "person", T.id, "mbroecheler", "name", "Matthias Broecheler", "age", 29, "addr", "San Francisco", "weight", 1)titan = graph.addVertex(T.label, "software", "name", "Titan", "lang", "java", "tag", "Graph Database", "weight", 1)dalaro.addEdge("created", titan, "weight", 1)
mbroecheler.addEdge("created", titan, "weight", 1)
okram.addEdge("created", titan, "weight", 1)dalaro.addEdge("knows", mbroecheler, "weight", 1)titan.addEdge("implements", tinkerpop, "weight", 1)
titan.addEdge("supports", gremlin, "weight", 1)// HugeGraph
javeme = graph.addVertex(T.label, "person", T.id, "javeme", "name", "Jermy Li", "age", 29, "addr", "Beijing", "weight", 1)
zhoney = graph.addVertex(T.label, "person", T.id, "zhoney", "name", "Zhoney Zhang", "age", 29, "addr", "Beijing", "weight", 1)
linary = graph.addVertex(T.label, "person", T.id, "linary", "name", "Linary Li", "age", 28, "addr", "Wuhan. Hubei", "weight", 1)hugegraph = graph.addVertex(T.label, "software", "name", "HugeGraph", "lang", "java", "tag", "Graph Database", "weight", 1)javeme.addEdge("created", hugegraph, "weight", 1)
zhoney.addEdge("created", hugegraph, "weight", 1)
linary.addEdge("created", hugegraph, "weight", 1)javeme.addEdge("knows", zhoney, "weight", 1)
javeme.addEdge("knows", linary, "weight", 1)hugegraph.addEdge("implements", tinkerpop, "weight", 1)
hugegraph.addEdge("supports", gremlin, "weight", 1)

图的基本概念与操作

g.V()   # 查询图的所有节点
g.E()   # 查询所有边的信息
g.V().id()  # 查询顶点的ID
g.E().id()  # 查询边的ID
g.V().label()  # 查询所有顶点的label
g.E().label()  # 查询所有边的label
g.V().properties()  # 查询所有顶点的属性
g.E().properties()  # 查询所有边的属性
g.V().properties().value()  # 查询所有顶点的属性值
g.V().valueMap()  # 查询所有顶点的属性
g.V().values()  # 与g.V().properties().value()相同
g.E().values()  # 与g.E().properties().value()相同

p.s. 节点和边的ID其实就是key值
**g.V().properties().value()和g.V().valueMap()**的区别:

  • g.V().properties().value()是将结果扁平化到同一个列表中
  • g.V().valueMap()将一个顶点或一条边的属性作为一组,每一组由若干属性的键值对组成
    valueMap

properties.value

遍历操作

以顶点为基准

  • out(label): 根据指定的EdgeLabel来访问顶点的OUT方向邻接点(可以是零个EdgeLabel,代表所有类型边;也可以一个或多个EdgeLabel,代表任意给定EdgeLabel的边,下同)
g.V().out()   # 查询所有节点的后继节点
g.V('2:Titan').out()  # 查询ID为'2:Titan'节点的后继节点
  • in(label): 根据指定的EdgeLabel来访问顶点的IN方向邻接点
g.V().out()   # 查询所有节点的前继节点
g.V('2:Titan').out()  # 查询ID为'2:Titan'节点的前继节点
  • both(label): 根据指定的EdgeLabel来访问顶点的双向邻接点
g.V().both()   # 查询所有节点的邻接节点
g.V('2:Titan').both()  # 查询ID为'2:Titan'节点的邻接节点
  • outE(label): 根据指定的EdgeLabel来访问顶点的OUT方向邻接边
g.V().outE()  # 查询所有节点的出度边
g.V('2:Titan').outE()  # 查询ID为'2:Titan'的节点的出度边
g.V('2:Titan').outE('implements')  # # 查询ID为'2:Titan'的节点的label为'implements'的出度边
  • inE(label): 根据指定的EdgeLabel来访问顶点的IN方向邻接边
g.V().inE()  # 查询所有节点的入度边
g.V('2:Titan').inE()  # 查询ID为'2:Titan'的节点的入度边
g.V('2:Titan').inE('created')  # # 查询ID为'2:Titan'的节点的label为'created'的出度边
  • bothE(label): 根据指定的EdgeLabel来访问顶点的双向邻接边
g.V().bothE()  # 查询所有节点的相连的边
g.V('2:Titan').bothE()  # 查询ID为'2:Titan'的节点的相连的边
g.V('2:Titan').bothE('created', 'implements')  # # 查询ID为'2:Titan'的节点的label为'created'或'implements'的相连的边

以边为基准

  • outV(): 访问边的出顶点(注意:这里是以边为基准,上述Step均以顶点为基准),出顶点是指边的起始顶点
g.V('3:Gremlin').inE().outV()  # 查询id为'3:Gremlin'的入度边的出顶点
  • inV(): 访问边的入顶点,入顶点是指边的目标顶点,也就是箭头指向的顶点
  • bothV(): 访问边的双向顶点
  • otherV(): 访问边的伙伴顶点,即相对于基准顶点而言的另一端的顶点
g.V('3:Gremlin').inE().otherV()  # 查询id为'3:Gremlin'的入度边的伙伴顶点

http://chatgpt.dhexx.cn/article/6NnPnB1x.shtml

相关文章

基于Gremlin语言图数据库查询的优化

图谱结构: 其中query标签的结构: 列名类型说明idinteger唯一主键classstring类别 a_[a|b|c|d|e|f]标签的结构 列名类型说明idinteger唯一主键classstring类别,关联到query的类别namestring名称 b_[a|b|c|d|e|f]标签的结构 列名类型说明id…

Gremlin学习笔记

前言 本文基于HugeGraph提供的HugeGraph-Studio编写示例代码,下图是示例关系图,示例数据在文末 基本概念 Gremlin是Apache TinkerPop框架下规范的图语言,相当于SQL之于关系型数据库 节点Vertex:一般指实体,如&#xf…

gremlin图查询插件

gremlin是一个通用的图查询插件,尽管在neo4j上可以使用Cypher语言进行查询,但我仍想调研一下通过gremlin查询neo4j。 1. 安装 插件下载地址:https://archive.apache.org/dist/tinkerpop/,这里下载了3.4.4版本的console和server压…

gremlin语法详解

初步认识 点:蓝色的圈代表顶点(查询语句中的V()),圈中的person代表顶点的名称,name和age为顶点的属性。 边:黑色的线代表边(查询语句中的E()),线上的knows代表边的名称,weight为边…

gremlin语句详解

到了新公司用到了tinkerPop的gremlin语句,由于是全英文的文档。为了杜绝我鱼记忆,决定整理一下以后查看方便。嗯嗯~ o(* ̄▽ ̄*)o 附图:语句来源于图片 初步认识: 点:蓝色的圈代表顶点&#xff…

图数据库入门教程-深入学习Gremlin(1):图基本概念与操作

前言:Gremlin语言是图数据库最主流的查询语言,是Apache TinkerPop框架下规范的图语言,相当于SQL之于关系型数据库。为了图数据库使用者更好的掌握Gremlin这门图语言,我们对Gremlin Steps进行了分类与总结,接下来将会出…

Gremlin:图遍历语言

Gremlin简介 Gremlin是Apache TinkerPop 框架下的图遍历语言。Gremlin是一种函数式数据流语言,可以使得用户使用简洁的方式表述复杂的属性图(property graph)的遍历或查询。每个Gremlin遍历由一系列步骤(可能存在嵌套)…

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 …