TinkerPop
TinkerPop
- TinkerPop是一个面向实时事务处理(OLTP),以及批量图分析(OLAP)的图计算框架。
- TinkerPop是一个总称,它包含若干子项目,以及核心TinkerPop Gremlin引擎集成的模块。在TinkerPop2及之前,TinkerPop分为若干子项目,而从TinkerPop3起,都合并到了Gremlin。
- Gremlin相当于一个JDK,不管通过哪种语言编写的Gremlin程序,不管是编写的OLTP程序还是OLAP程序,都可以通过编译成Gremlin字节码,在GTM(Gremlin Traversal Machine)上执行。
- TinkerPop不是一个完整的图数据系统,其提供了操作图数据的图形结构接口,图操作过程接口,以及编写图形操作程序的Gremlin语言,和执行图形遍历过程的GTM,但是其并不提供数据持久化存储功能。
- 图计算 = Structure(数据结构) + Process(处理过程)
Tinker Provider
TinkerPop抽象了图谱的数据结构,包含Graph、Vertex、Edge、Vertex Property、Property。
TinkerPop也定义了图计算、遍历所需的一些抽象接口。
一个第三方的图数据库如果实现了TinkerPop定义的数据结构以及接口,就可以享受它的Gremlin、算法等福利。
Provider包含:
- Graph System Provider
- Graph Database Provider
- Graph Processor Provider
- Graph Driver Provider
- Graph Language Provider
- Graph Plugin Provider
TinkerPop-Enabled Providers
Provider Documentation
图数据库之TinkerPop Provider
Get-Started
使用console或者server来启动TinkerPop,它使用TinkerGraph作为图数据库,TinkerGraph是一个基于内存的图形系统,它实现了TinkerPop定义的接口,但是它没有提供数据持久化的功能。
启动:
console启动:bin/gremlin.sh
server启动:bin/gremlin-server.sh + 配置文件。
使用websocket方式启动:bin/gremlin-server.sh conf/gremlin-server-modern.yaml
使用rest方式启动:bin/gremlin-server.sh conf/gremlin-server-rest-modern.yaml
创建Graph和Traversal
console版本需要创建Graph和Traversal,Server版本启动后会自动创建。
graph = TinkerFactory.createModern()
g = traversal().withEmbedded(graph)
先创建一个图,这个图包含了图形的数据。只有图形不足以完成图计算的工作,还需要指定图遍历的信息,包含遍历策略和遍历引擎等。有了这两个才可以进行图计算的操作。
顶点和边的保留属性
id和label是顶点和边的保留属性。
label类似于collection,用来给顶点和边进行分类。
在创建顶点和边的时候如果没有指定id,则会自动生成一个id。
操作
创建:
-
创建图:
graph = TinkerGraph.open()
-
创建遍历:
g = traversal().withEmbedded(graph)
-
创建顶点:
g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29)
-
创建边:
g.addE('friend').from(g.V(1).next()).to(g.V(3).next())
-
创建边:
g.V(1).addE('o1').to(g.V(3).next()).property(T.id,'10').property('weight','0.4')
-
创建图形:
v1 = g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).next() v2 = g.addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").next() g.addE("created").from(v1).to(v2).property(T.id, 9).property("weight", 0.4)
查询:
- 查询所有的顶点:
g.V()
- 根据id查询顶点:
g.V(1)
- 根据属性筛选顶点:
g.V().has('name','marko')
- 根据属性和label筛选顶点:
g.V().has('person','name','marko')
- 筛选多个条件:
g.V().has('person','name',within('marko','josh'))
- 查询顶点id:
g.V().id()
- 查询顶点label:
g.V().label()
- 查询顶点所有属性:
g.V(1).properties()
- 查询顶点指定属性:
g.V(1).properties('name')
- 查询顶点的值:
g.V(1).values()
- 查询顶点的值:
g.V(1).values('name')
- 查询顶点的值,按map格式输出:
g.V(1).valueMap()
- 查询顶点的出边:
g.V(1).outE()
- 查询顶点出边的label:
g.V(1).outE().label()
- 查询顶点出边:
g.V(1).outE('person')
- 查询顶点的入边:
g.V(1).inE()
- 查询顶点出边的顶点:
g.V(1).out()
- 查询所有边:
g.E()
- 查询边的顶点:
g.E(1).V()
- 查询边的入度顶点:
g.E(1).inV()
- where as:
g.V().has('person','name','marko').as('exclude').out('created').in('created').where(neq('exclude')).values('name')
- group by:
g.V().group().by(label).by('name')
- 求平均值:
g.V().has('person','name',within('vadas','marko')).values('age').mean()
删除:
- 删除顶点:
g.V(1).drop()
- 删除边:
g.E(1).drop()
- 删除属性:
g.V(1).properties('age').drop()
更新:
- 更新属性:
g.V(1).property('age',40)
- 追加属性:
g.V(1).property(list,name','ako')
求两顶点最短路径:
- g.V(1).repeat(out()).until(hasId(2)).limit(1).path()
求连通子图:
- g.V(1).repeat(outE().subgraph(‘connGraph’).inV()).until(outE().count().is(0)).cap(‘connGraph’)