Loading

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

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

  • 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

posted @ 2022-08-29 10:31  树先生1024  阅读(869)  评论(0编辑  收藏  举报