gremlin图查询插件

article/2025/10/7 18:24:25

gremlin是一个通用的图查询插件,尽管在neo4j上可以使用Cypher语言进行查询,但我仍想调研一下通过gremlin查询neo4j。

1. 安装

插件下载地址:https://archive.apache.org/dist/tinkerpop/,这里下载了3.4.4版本的console和server压缩包
gremlin的参考文档:https://tinkerpop.apache.org/docs/3.6.0/tutorials/getting-started/

2. 配置Neo4j连接

Tinkerpop Server 3.4.4支持的Neo4j版本是3.2.3。

  1. 安装neo4j依赖
cd /opt/gremlin/apache-tinkerpop-gremlin-server-3.4.4
bin/gremlin-server.sh install org.apache.tinkerpop neo4j-gremlin 3.4.4

在这里插入图片描述

  1. 配置conf/gremlin-server-neo4j.yaml和neo4j-empty.properties

在gremlin-server-neo4j.yaml配置需要连接的neo4j服务的ip和port

hosts: [10.30.239.205]
port: 7687

在neo4j-empty.properties配置需要连接的neo4j的数据库

gremlin.neo4j.directory=/opt/neo4j/data/databases/graph.db
  1. 启动Tinkerpop Server
bin/gremlin-server.sh conf/gremlin-server-neo4j.yaml

发现报错,无法连接:
在这里插入图片描述
排查后,关闭neo4j的服务,再次启动,成功

./neo4j stop

在这里插入图片描述

  1. 通过console访问

进入console…/conf目录,在remote.yaml文件中添加需要连接的neo4j库的host和port:

hosts: [10.30.239.205]
port: 7687

启动console客户端

cd /opt/gremlin/apache-tinkerpop-gremlin-console-3.4.4
./bin/gremlin.sh

执行如下命令,连接已配置好的neo4j数据库

:remote connect tinkerpop.server ./conf/remote.yaml
:remote console
# 确认连接是否成功
g

在这里插入图片描述
退出console

# 退出
:exit

3. 常用语法

gremlin的语法参考文档:https://blog.csdn.net/javeme/article/details/82631834,http://tinkerpop-gremlin.cn/#where-step
此处仅列出一些基础知识和个人在项目中可能使用的一些查询模板,V是节点的关键字,E是边的关键字。

  1. V()、E()、id()、label()、properties()、valueMap()、values()
  2. out()、in()、both()、outE()、inE()、bothE()、outV()、inV()、bothV()、otherV()
  3. hasLabel(labels…​)、hasId(ids…​)、has(key, value)、has(label, key, value)、has(key, predicate)、hasKey(keys…​)、hasValue(values…​)、has(key)、hasNot(key)
  4. count()、range()、limit()、tail()、skip()
  5. path()、simplePath()、cyclicPath()
  6. repeat()、times()、until()、emit()、loops()
  7. order()、by()
  8. group()、groupCount()、dedup()、by()
  9. where()、filter()
    and、or、eq、neq、lt、lte、gt、gte、inside、outside、between、within、without、not
  10. is()、and()、or()、not()
  11. sum()、max()、min()、mean()
  12. math()
  13. as()+select()、as()+where()、as()+match()、as()+dedup()
  14. choose()、branch()
  15. coalesce()、optional()、union()
  16. aggregate()、store()、unfold()、fold()
  17. match()
  18. sample()、coin()、constant()、inject()
  19. sack()
  20. barrier()
  21. local()、count()、max()、mean()、min()、sum()、order()、tail()、limit()、range()、sample()、skip()、limit()、dedup()
  22. hasNext()、next()、tryNext()、toList()、toSet()、toBulkSet()、fill()、iterate()
  23. map、flatMap()
  24. sideEffect()
  25. profile()、explain()

3.1 基础知识-v/e/p

# 查所有的节点
g.V()
# 查所有的边
g.E()

在这里插入图片描述
在这里插入图片描述

# 查某个节点id的所有属性
g.V(0).properties()
# 查所有节点的title属性值
g.V().properties('title')
# 查所有节点的属性
g.V().valueMap()

在这里插入图片描述
在这里插入图片描述

3.2 遍历

通过顶点来访问与其有关联边的邻接顶点.

# 查询id为0的节点所有相连的节点,可以通过both('')来限制相邻的边的类型
# 可以在语句中追加使用.out()、.in()来进行N度查询
g.V(0).both()
# barrier(),栅栏,可以强制之前的step都执行完毕后才会执行后面的step
# barrier()可以优化语法的执行效率
# LazyBarrierStrategy是默认策略,该策略会在合适的地方插入barrier,即隐式的自动使用barrier
g.V().both().barrier().both()

在这里插入图片描述

3.3 条件过滤

has语句是filter类型语句的代表,能够以顶点和边的属性作为过滤条件,决定哪些对象可以通过

# has(label, key, value),通过label和属性的名字和值过滤顶点和边
# 问题1:value需要完全相等,能不能部分相等
g.V().has('Actor', 'name', 'Keanu Reeves')
# 问题2:有多个label的节点查不出来
g.V().hasLabel('Movie::Sequel')
# 多个label的节点可以通过此语法查询
g.V().filter {it.get().label() == 'Movie::Sequel'}

在这里插入图片描述
在这里插入图片描述

3.4 路径

# 需要注意的是path()只能接在V后面使用
# simplePath():只保留路径中不含有环路的对象
# cyclicPath():只保留路径中含有环路的对象
g.V().has('Actor', 'name', 'Keanu Reeves').bothE().otherV().path()

在这里插入图片描述

3.5 分支

类似于if…else…then,或者switch…case…这样的功能,主要通过choose关键字实现
在这里插入图片描述

3.6 模式匹配

gremlin通过match语法实现模式匹配功能

// 对每一个顶点,用以下模式去匹配,满足则生成一个map<String, Object>,不满足则过滤掉
// 模式1:“a”对应当前顶点,且创建了软件“HugeGraph”
// 模式2:“b”对应顶点软件“HugeGraph”
// 模式3:“c”对应创建软件“HugeGraph”的年龄为29的person顶点
g.V().match(__.as('a').out('created').has('name', 'HugeGraph').as('b'),__.as('b').in('created').has('age', 29).as('c'))

3.7 local

挺让人费解的一个用法,不太明白它的含义和它实现的功能。
local是对单个对象的局部操作,很多操作是针对传递过来的对象流中的全部对象进行操作,但也有很多时候需要针对对象流中的单个对象而非对象流中的全部对象进行一些操作。

# 输出所有节点的第一个属性
g.V().valueMap().limit(local, 1)
# 输出第一个节点的属性
g.V().valueMap().limit(1)
# 所有顶点一步邻居中所有的Actor
g.V().both().group().by(label).select('Actor').dedup(local)
# 所有顶点一步邻居中所有的Actor
g.V().both().group().by(label).select('Actor').dedup()

在这里插入图片描述

在这里插入图片描述

4. python访问

上面都是通过gremlin的console界面进行查询,此处,将介绍使用python来进行gremlin查询。
安装gremlin-python,pip3 install gremlinpython==3.6.0,连接服务器:

conn = DriverRemoteConnection('ws://%s:%s/gremlin' % (self.host, self.port), 'g')
graph = traversal().withRemote(conn)

常用的算子都在process下:

from gremlin_python.driver.driver_remote_connection import \DriverRemoteConnection
from gremlin_python.process.anonymous_traversal import traversal
from gremlin_python.process.graph_traversal import both, in_, out, as_, label, \count, valueMap, has, bothE, hasId, __, local, values, unfold
from gremlin_python.process.traversal import neq, lte, eq, within, gt, \containing
from gremlin_python.process.traversal import Scope, WithOptions

一些常用的查询语法:

graph.V(22).out(a[2]).in_().where(out().count().is_(gt(10))).values('name').toList()
graph.V(22).repeat(__.both().simplePath()).until(__.hasId(434).or_().loops().is_(eq(2))).hasId(434).path().toList()
graph.V().label().dedup().toList()
# count(Scope.local):统计list内部元素的数量,15700
# count():统计有多少List,1
g.V().has('name', containing('0')).fold().count(Scope.local).toList()
# 将节点按label分组统计
graph.V().groupCount().by(label()).toList()
# 返回某个节点的属性,体会以下两个语法的不同
# valueMap():每key维护着一个值的list,[{name:..., tel:...}, {...}]
graph.V(1).valueMap().toList()
# 下列语法等效
g.V(1).properties().value().toList()
graph.V(1).values().toList()
# by(unfold()):将值的list转换为一个单一值
graph.V().has('name', containing('0')).limit(2).valueMap().by(unfold()).toList()
# valueMap():只列出属性,若需要输出id、label等需使用with
graph.V().has('name', containing('0')).limit(2).valueMap().with_(WithOptions.tokens).toList()
graph.V(1).out('电话').aggregate('x').by('name').cap('x').toList()
graph.V().values('count').order().by(Order.desc).toList()

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

相关文章

gremlin语法详解

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

gremlin语句详解

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

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

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

Gremlin:图遍历语言

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

TWR双边测距

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

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

为什么80%的码农都做不了架构师&#xff1f;>>> 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调试日志

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

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

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

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

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

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.总结 说来惭愧&#xff0c;这一点点东西做了快3个月[手动狗头.jpg] 但是这个协议的深入学习让我真正认识到研究生该怎样…

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

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

24C02 Twr

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

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

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

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

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

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

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

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

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

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

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

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

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

UWB DW1000 TWR测距定位功能实现

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