提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
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()
总结
欢迎评论区交流一起进步。。