图数据库入门教程(五)关系查询
涉及的语法,关于语法更多的使用方式参考官方文档
- outE
- out
- inE
- in
- otherV
- bothE
- both
- simplePath
先贴上上一章节创建的样例数据
1. outE(label)
g.V().has('person','name','张三').outE('know')
查询从张三出发向外指出的边(关系),label是know,如下图返回了三条边的信息,我们从图可以知道,其实这三条边是指向王五、孙八、李四
g.V().has('person','name','张三').outE('know').inV()
我们加上inV()表示在outE('know')后,继续往外走,查询边进入了哪些节点,inV代表边进入了哪个节点,outV代表边是送哪个节点出来的。
我们知道,outE('know')后我们的边进入了王五、孙八、李四三个节点,返回了节点信息
g.V().has('person','name','张三').outE('know').outV()
换成outV输出如下,和我们上边说的理解一样
2. out(label)
out(label)本质上等于outE().inV()
g.V().has('person','name','张三').out("know")
输出
3. inE(label)
g.V().has('person','name','王五').inE("know")
由于王五的朋友关系不是从王五出发,而是指向王五的,所以我们要查询王五的朋友关系,就不能用outE,而是inE
g.V().has('person','name','王五').inE("know").outV()
在查询出王五的朋友关系后,继续查询关系从哪些顶点出来的,也就是王五的朋友
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")
g.V().has('person','name','李四').bothE("know").otherV()
思考一下
如果此时不用otherV行不行?为什么
7. both(label)
both(label)=bothE(label).otherV()
8. simplePath()
我们来分析一下查找张三好友的好友的过程
- 查找张三的好友
- 根据张三的好友,查找张三的人好友的好友
g.V().has("person","name","张三").both()
查找张三的好友的好友
g.V().has("person","name","张三").both().both()
第二次both的时候,其实就是分别找王五、李四、孙八的both
你会发现,这次both后,你会发现有一些节点被误扫描到了
- 张三:3次
- 李四:1次
- 孙八:1次
- 赵六:1次
- 朱七:1次
张三这个出发点居然被扫描到了,有办法避免吗?有办法,使用simplePath,可以防止扫描走回头路
g.V().has("person","name","张三").both().both().simplePath()
查看执行结果,你会发现张三已经被去掉了
那孙八、李四怎么排除掉呢?下一章讲解。
9. 更多场景
g.V().has('person','name','张三').bothE().has("knowTime",2021).otherV()
g.V().has('person','name','张三').bothE().has("knowTime",gte(2018)).otherV()
这里出来了一个我们没见过的比较符号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))