Janusgraph学习记录(3)

本文详细记录了使用Janusgraph进行图数据库操作的过程,包括增删顶点和边、路径查找、边的筛选与遍历等。在实际操作中遇到查询返回结果不一致的问题,以及探讨了如何避免路径遍历中的环问题。同时,文章提供了清除图中所有数据的方法,并展示了基于属性筛选边的示例。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

Janusgraph学习记录(3)


前言

学习Janusgraph的相关记录,全部都是实操,概念不赘述。相关查询语句的编写基于《图数据库实战》提供的数据来做测试。


一、寻路遍历与图变异

变异(mutation)可以简单理解为通过增加、修改、删除顶点(边或属性)来改变图。

二、具体操作

1.增加、删除顶点和边

添加顶点代码如下:
在这里插入图片描述
发现一个问题,同样的查询语句

g.V().has('person','first_name','Dave').next()

在linux中得到的结果是:
在这里插入图片描述
在pycharm中:
在这里插入图片描述
即查询语句只返回其中一个结果,实际上label、name相同的点有多个,这个暂时没看到解决途径,有了解的麻烦评论区指导一下,谢谢
另外还发现,写入的点都能通过linux中gremlin-console查到,但唯独12496这个点查不到。。。暂时不知道是为什么
当然我们最需要注意的还是相同的数据主键值不同,都是自动赋值的唯一uid。这个主键是可以改的,比如改成某一属性值作为唯一uid。

添加边代码如下:

edge = g.addE('friends').from_(V().has('person','first_name','Ted')).to(V().has('person','first_name','Hank'))

删除顶点的代码如下:

deleteV = g.V(id).drop()

删除边的代码如下:

deleteV = g.E(id).drop()

这两个方法都属于基本操作,后面会介绍更好的方法。另外有几项实用的功能还需要补充一下:

g.V().drop().iterate()

用来清除图中所有数据,iterate()和next()类似都会触发遍历,区别就是next()会返回遍历结果。
当然iterate()还有一个作用就是链式变异,简化增加数据的语句,比如:

g.addE('friends').from('a').to('b').
  addE('friends').from('c').to('d').iterate()

2.查找路径

查找简单路径避免出现环的问题,代码如下:

path = g.V().has('person','first_name','Ted').until(has('person','first_name','Denise')).repeat(both('friends').simplePath()).path().next()

simplePath():筛选掉遍历中被重复访问的点。
在这里插入图片描述
之所以在repeat()里添加simplePath()而不是把simplePath()放在整个语句的最后是为了避免出现环,需要评估当前位置以及在每一次循环迭代结束时图的历史路径,避免困在环里出不来。

3.筛选和遍历边

主要分为三部分,一是遍历边的E操作和V操作;二是通过属性筛选边;三是在路径结果中包括边。

1.遍历边的E操作和V操作

主要引入边的属性进行筛选,操作结束的位置实际上都在边上而不再顶点上。

g.V().has('person','first_name','Dave').bothE('works_with').has('end_year',lte(2018)).otherV().values('first_name')

InE(label):从当前顶点遍历到相邻的入边。
outE(label):从当前顶点遍历到相邻的出边。
both(label):从当前顶点遍历到相邻边,不考虑方向。

inV():从当前边遍历到入顶点,通常配合outE()操作使用。
outV():从当前边遍历到出顶点,通常和inE()操作使用。
otherV():遍历到不是出顶点的那个顶点,通常和bothE()搭配操作使用。
bothV():从当前边遍历到两个相邻顶点。

在这里插入图片描述
对比下otherV和bothV的差异:
在这里插入图片描述
查找Dave所有同事的两种方法:
在这里插入图片描述
如果不在边上做任何操作,明显第二种更简便。

2.通过属性筛选边

通常分为两类:基于时间筛选和基于权重筛选。示例基于时间做了筛选:
在这里插入图片描述
需要配合使用断言操作进行筛选。

3.在路径结果中包括边

实现遍历显示路径中的边,示例如下:
在这里插入图片描述

from gremlin_python import statics
from gremlin_python.process.graph_traversal import __, out, has, V, both, bothE
from gremlin_python.process.traversal import lte, gte
from gremlin_python.structure.graph import Graph
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.process.anonymous_traversal import traversal

graph = Graph()
connection = DriverRemoteConnection('ws://192.168.171.77:8182/gremlin', 'g')
# The connection should be closed on shut down to close open connections with connection.close()
g = graph.traversal().withRemote(connection)
# Reuse 'g' across the application
#添加点
dave = g.addV('person').property('first_name', 'Dave').next()
josh = g.addV('person').property('first_name', 'Josh').next()
ted = g.addV('person').property('first_name', 'Ted').next()
hank = g.addV('person').property('first_name', 'Hank').next()
#添加边
g.addE('friends').from_(dave).to(ted).next()
g.addE('friends').from_(dave).to(josh).next()
g.addE('friends').from_(dave).to(hank).next()
g.addE('friends').from_(josh).to(hank).next()
g.addE('friends').from_(ted).to(josh).next()
#添加点
kelly = g.addV('person').property('first_name', 'Kelly').next()
jim = g.addV('person').property('first_name', 'Jim').next()
paras = g.addV('person').property('first_name', 'Paras').next()
denise = g.addV('person').property('first_name', 'Denise').next()
#添加边  注意用的是链式变异
g.addE('friends').from_(dave).to(jim).addE('friends').from_(dave).to(kelly).addE('friends').from_(kelly).to(jim).addE(
    'friends').from_(kelly).to(denise).addE('friends').from_(jim).to(denise).addE('friends').from_(jim).to(paras).addE(
    'friends').from_(paras).to(denise).iterate()
#添加带属性的边可做基于边的属性筛选 链式变异
g.addE('works_with').from_(dave).to(josh).property('start_year',2016).property('end_year',2017).addE(
    'works_with').from_(dave).to(ted).property('start_year',2016).property('end_year',2017).addE('works_with').from_(
    josh).to(ted).property('start_year',2016).property('end_year',2019).addE('works_with').from_(dave).to(
    hank).property('start_year',2017).property('end_year',2018).addE('works_with').from_(dave).to(kelly).property(
    'start_year',2018).addE('works_with').from_(dave).to(denise).property('start_year',2018).addE('works_with').from_(
    denise).to(kelly).property('start_year',2018).iterate()
#删除图中所有点
g.V().drop().iterate()
#simplePath()避免了环问题的出现,在路径结果中包括边的信息
g.V().has('person', 'first_name', 'Ted').until(has('person', 'first_name', 'Denise')).repeat(
    bothE('works_with').otherV().simplePath()).path().next()
#基于属性筛选边  示例是基于时间筛选  还可基于权重做筛选
g.V().has('person','first_name','Dave').bothE('works_with').has('end_year',lte(2018)).otherV().values('first_name')

connection.close()


总结

欢迎评论区交流一起进步。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值