首页 > 数据库 >图数据库入门教程(五)关系查询

图数据库入门教程(五)关系查询

时间:2022-08-29 10:46:07浏览次数:59  
标签:张三 name 数据库 入门教程 查询 person know 王五 label

涉及的语法,关于语法更多的使用方式参考官方文档

  • outE
  • out
  • inE
  • in
  • otherV
  • bothE
  • both
  • simplePath

先贴上上一章节创建的样例数据

img

img

1. outE(label)

g.V().has('person','name','张三').outE('know')

查询从张三出发向外指出的边(关系),label是know,如下图返回了三条边的信息,我们从图可以知道,其实这三条边是指向王五、孙八、李四

img

g.V().has('person','name','张三').outE('know').inV()

我们加上inV()表示在outE('know')后,继续往外走,查询边进入了哪些节点,inV代表边进入了哪个节点,outV代表边是送哪个节点出来的。

我们知道,outE('know')后我们的边进入了王五、孙八、李四三个节点,返回了节点信息

img

g.V().has('person','name','张三').outE('know').outV()

换成outV输出如下,和我们上边说的理解一样

img

2. out(label)

out(label)本质上等于outE().inV()

g.V().has('person','name','张三').out("know")

输出

img

3. inE(label)

g.V().has('person','name','王五').inE("know")

由于王五的朋友关系不是从王五出发,而是指向王五的,所以我们要查询王五的朋友关系,就不能用outE,而是inE

img

g.V().has('person','name','王五').inE("know").outV()

在查询出王五的朋友关系后,继续查询关系从哪些顶点出来的,也就是王五的朋友

img

4. in(label)

和out(label)类似,in(label)==inE("know").outV(),自己动手试试吧

5. otherV()

我们看一下查询张三和王五朋友关系的语句

g.V().has('person','name','张三').outE('know').inV()
g.V().has('person','name','王五').inE("know").outV()

写这个语句的时候,我们的脑子还要时时想着应该是inV还是outV,一个不小心写反,就把自己查出来了,能不能让我不关注这个,我要查的就是相对于当前顶点往外的顶点,用otherV()试试吧

g.V().has('person','name','张三').outE('know').otherV()
g.V().has('person','name','王五').inE("know").otherV()

6. bothE(label)

查询下李四的朋友关系试试?从图中,我们可以看到张三、孙八、朱七都是李四的朋友,但是关系的方向如下

张三、孙八-->李四

李四-->朱七

所以我们用inE和outE都不能同时把这三个边查出来,这时候就需要bothE(label)了,它不区分关系的方向

g.V().has('person','name','李四').bothE("know")

img

g.V().has('person','name','李四').bothE("know").otherV()

img

思考一下

如果此时不用otherV行不行?为什么

7. both(label)

both(label)=bothE(label).otherV()

8. simplePath()

我们来分析一下查找张三好友的好友的过程

  1. 查找张三的好友
  2. 根据张三的好友,查找张三的人好友的好友
g.V().has("person","name","张三").both()

img

查找张三的好友的好友

g.V().has("person","name","张三").both().both()

第二次both的时候,其实就是分别找王五、李四、孙八的both

img

你会发现,这次both后,你会发现有一些节点被误扫描到了

  • 张三:3次
  • 李四:1次
  • 孙八:1次
  • 赵六:1次
  • 朱七:1次

张三这个出发点居然被扫描到了,有办法避免吗?有办法,使用simplePath,可以防止扫描走回头路

img

g.V().has("person","name","张三").both().both().simplePath()

查看执行结果,你会发现张三已经被去掉了

img

那孙八、李四怎么排除掉呢?下一章讲解。

9. 更多场景

g.V().has('person','name','张三').bothE().has("knowTime",2021).otherV()

img

g.V().has('person','name','张三').bothE().has("knowTime",gte(2018)).otherV()

img

这里出来了一个我们没见过的比较符号gte,它的含义是>=,除此之外还有哪些比较符号呢?

lt <
lte <=
gt >
gte >=
inside(a,b) >a <b
outside(a,b) b
between(a,b) >=a <=b
g.V().has('person','name','张三').both().has('age', lt(20))

img

标签:张三,name,数据库,入门教程,查询,person,know,王五,label
From: https://www.cnblogs.com/roylee666/p/16635047.html

相关文章

  • 图数据库入门教程(六)复杂关系查询
    涉及的语法,关于语法更多的使用方式参考官方文档aggregatewherewithoutgroupgroupCountordercapunfoldlocal可能认识的人查询可能认识的人g.V().has('person......
  • 图数据库入门教程(七)结果处理
    1.count()统计当前结果的数量//1.查询所有节点数量g.V().count()//2.查询label是person的节点数量g.V().hasLabe('person').count()//3.查询张三好友的数量g.V(......
  • 图数据库入门教程(三)安装图数据库环境
    前面唠叨了一大堆,是不是已经迫不及待上手练练了,Let'sgo搭建janusgraph图数据库服务假设我们线上用的是阿里云的gdb,我们要学习gdb有两种方式:自己买一台使用其他实现......
  • 图数据库入门教程(一)简单理解图数据库
    以下内容是个人的理解,一家之言,可能误导,但能入门为什么会有图数据库?作为研发,我们接触最多的当属关系型数据库:Mysql、Oracle,还有一些非关系型数据库:MongoDB、Redis等,再广......
  • 图数据库入门教程(二)认识tinkerpop与gremlin
    上一篇文章我们对图数据库有了一个简单的理解,对于关系的计算优雅而快速,适用与一些关系计算的场景,比如社交网络、金融反欺诈、商机发现、智能推荐等,想了解更多可以看一下阿......
  • mysql导入.idb文件进行修复数据库
    背景:数据库在运行过程中出现了问题,需要根据*.idb文件进行找回数据操作步骤:1)先创建一个同样数据格式的表(之前存在的话备份删除,最好先在新的数据库中走一遍流程)--......
  • Oracle用户创建、赋权、查询及删除操作
    首发微信公众号:SQL数据库运维原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1&sn=450e9e94fa709b5eeff0de371c62072b&chksm=ea37536cdd......
  • 三丰主机数据库对外使用操作
    设备mysql数据库对外使用的方法:一、找到使用电脑的互联网IP二、进行界面设置  通过以上设置,就可以正常访问数据库了......
  • 二.查询语句
    一.分组查询SELECTMAX(age)FROMstudent;#查询年龄最大的数字为32SELECT*FROMstudentWHEREage=32;#查询32的学生信息SELECT*FROMstudentWHERE......
  • Flyway管理数据库MySQL5.7入坑记录(二)
    在成功加入Flyway的Gradle的插件后,在Gradle的任务中选择flyway->flywayMigrate,进行数据库迁移操作,于是出现下面的问题。第二坑:执行flyMigrate出现错误信息:flywayNodatab......