Gremlin 入门

Gremlin 学习笔记目录

The First Five Minutes

遍历图的基础知识

  • g.V() 遍历图中所有顶点
  • g.V(1).outE(‘knows’) 获取顶点“1”延伸出的所有带有标签“knows”的边指向的顶点
  • g.V(1).outE(‘knows’).inV().values(’name’) 获取具有唯一标识符“ 1”“知道”的顶点的人员的名称
  • g.V(1).out(‘knows’).values(’name’) = g.V(1).outE(‘knows’).inV().values(’name’)
  • g.V(1).out(‘knows’).has(‘age’, gt(30)).values(’name’) 找出顶点1的小弟中谁的年龄大于30

变量 g 只需要被实例化一次

The Next Fifteen Minutes

  • “label” 是顶点的保留属性
  • “id” 是边的保留属性
  • 也可以自己随意添加属性

创建图

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
gremlin> graph = TinkerGraph.open()
==>tinkergraph[vertices:0 edges:0]
gremlin> g = traversal().withEmbedded(graph)
==>graphtraversalsource[tinkergraph[vertices:0 edges:0], standard]
gremlin> v1 = g.addV("person").property(id, 1).property("name", "marko").property("age", 29).next()
==>v[1]
gremlin> v2 = g.addV("software").property(id, 3).property("name", "lop").property("lang", "java").next()
==>v[3]
gremlin> g.addE("created").from(v1).to(v2).property(id, 9).property("weight", 0.4)
==>e[9][1-created->3]

Graph Traversal - Staying Simple

简单的图遍历

  • g.V().has(’name’,‘marko’) 搜索所有符合条件(name = marko)的顶点
  • g.V().has(‘person’,’name’,‘marko’) 通过将顶点 label 包括在过滤器中,以确保“名称”属性键引用“人”顶点

重要提示:上面的查询会迭代图中的所有顶点以获取其答案。对于我们的小示例来说,这很好,但是对于数百万或十亿个边缘的图来说,这是个大问题。要解决此问题,您应该考虑使用索引。TinkerPop不提供索引管理的抽象。您应该查阅所选图形的文档,并利用其本机API创建索引,从而加快这些类型的查找。但是,遍历将保持不变,因为索引将在执行时透明地使用。

  • g.V().has(‘person’,’name’,‘marko’).outE(‘created’) 找出所有 label = created 的边指向的顶点关系
  • g.V().has(‘person’,’name’,‘marko’).outE(‘created’).inV() 获得边另一端的所有顶点对象
  • g.V().has(‘person’,’name’,‘marko’).out(‘created’) = g.V().has(‘person’,’name’,‘marko’).outE(‘created’).inV()
  • g.V().has(‘person’,’name’,‘marko’).out(‘created’).values(’name’) 获得顶点的 name 属性值

Graph Traversal - Increasing Complexity

图遍历-越来越复杂

  • g.V().has(‘person’,’name’,within(‘vadas’,‘marko’)).values(‘age’) 使用 within 查找 name in (‘vadas’,‘marko’) 的 age 属性的值
  • g.V().has(‘person’,’name’,within(‘vadas’,‘marko’)).values(‘age’).mean() mean() “vadas”和“ marko”的平均年龄
  • g.V().has(‘person’,’name’,‘marko’). out(‘created’).in(‘created’). values(’name’)
    • g.V().has(‘person’,’name’,‘marko’).out(‘created’) 找到 marko 创建的顶点
    • in(‘created’).values(’name’) 所有指向该顶点的顶点 name 属性的值
  • g.V().has(‘person’,’name’,‘marko’).as(’exclude’). out(‘created’).in(‘created’). where(neq(’exclude’)). values(’name’) 除自己以外的软件开发者
  • g.V().group().by(label) 按 label 分组(值为顶点对象)
  • g.V().group().by(label).by(’name’) 分组后显示 name 的值

不明白

1
2
3
4
gremlin> g.V().as('a').out().as('b').out().as('c').
           select('a','b','c')
==>[a:v[1],b:v[4],c:v[5]]
==>[a:v[1],b:v[4],c:v[3]]

The Final Ten Minutes

TIP 要在Graph创建时保持抽象,请使用GraphFactory.open()构造新实例。请参阅各个Graph实现的文档,以了解要提供的配置选项。

comments powered by Disqus