Loading

图数据库入门教程(四)基本概念和基本操作

涉及的语法,关于语法更多的使用方式参考官方文档

  • addV
  • addE
  • g.V()
  • g.E()
  • has相关

1. 基本概念

注意,现在不要拘泥于下面例子中语句中的具体语法,先做整体理解

1. Vertex(顶点)

顶点,表示一个数据节点,它一般对应一个实体,比如一个公司、一个人、一个产品、一本书等

创建一个"人"顶点:一个18岁的老王,是一个人'person'

g.addV('person').property('name','老王').property('age',18)

在gdotv中执行上面的语句,返回数据如下图

img

可以看到有三个视图:

QUERY OUTPUT:查询结果视图,这里展示 gremlin console输出和 json输出,gremlin console的输出可以简单的理解为返回的是顶点对象,如上图v[1642640],代表这是一个顶点,它的id是1642640

GRAPH VIEW:图结果视图,这里展示当前结果的图

img

默认情况下gdotv顶点图展示的是label+id,要想让顶点上展示老王(name),需要设置一下

1.点击顶点,再点击右侧出来的调色板图标

img

img

img

VERTEX VIEW:顶点视图,这里展示查询结果顶点列表(会自动去重)

img

Id

表示顶点的id,此处是自动生成,不同的图数据库厂商Id的支持也不同,有的支持自定义id的,也有不支持自定义id的,比如janusgraph就不支持,如果支持自定义id,我们可以用以下语句创建老王

//注意,不同于其他属性,id不带引号
g.addV('person').property(id,'老王').property('age',18)

Label

顶点或边的标签,一个顶点可以没有或只能有一个标签,代表节点的的分类,可以理解为关系型数据库的表名称。

Property

顶点的属性,我们此处建了两个属性:name和age

2. Edge(边)

边,通常表现为一个关系,两个顶点之间的关系,比如顶点"老王"「认识」 顶点"小张"

创建顶点小张

g.addV('person').property('name','小张').property('age',28)

创建老王和小张的边,即关系,这个关系代表他们认识,我们用英文know表示

g.V().has('person','name','老王').addE('know').to(__.V().has('person','name','小张')).property('knowTime',2018)

上面的语句是查询出label是person并且name是老王的顶点,添加一个边(关系),这个边(关系)的label是know,这个边(关系)指向查出的小张,并且这个边有一个属性,代表它们什么时候认识的knowTime=2018年。

执行以下语句,查询出刚刚创建的关系

g.E().hasLabel("know")

上述语句是查询所有label是know的边(关系)

img

Id

表示边的id,此处是自动生成

Label

边的标签,一个边可以没有或只能有一个标签,代表边点的的分类,可以理解为关系型数据库的表名称。

Property

顶点的属性,我们此处建了一个属性:knowTime(认识时间),其他字段比如In Vertex IdOut Vertex Id都是图数据库自动生成的,我不不作探究

边的方向

在gremlin中,边存在方向,比如我们创建的关系是老王->认识->小张,这个关系是从老王指向小张的。因为我们举的例子是「认识」,这种关系是双向的,有方向容易让人误解,但是如果这个关系不是「认识」而是「借钱给」,这个方向的作用就非常强烈了。

我们上面的语句是addE to,就代表关系从addE to左边的顶点指向addE to又边的顶点。

2. 基本操作

上面我们了解了ThinkerPop的基本概念,其实顺带着也做了创建顶点、创建边的基本操作。

官方gremlin语法文档 https://tinkerpop.apache.org/docs/3.4.0/reference/#addedge-step

插入数据

addV

g.addV("person").property('name','李四')

创建一个顶点,label是person,并添加name属性是李四

addE

g.V().has('person','name','老王').addE('know').to(__.V().has('person','name','小张'))

创建一个边,label是know

g.V().has('person','name','老王').addE('know').to(__.V().has('person','name','小张')).property('knowTime',2018)

创建一个边,label是know,并且边上有属性knowTime 2018

查询数据

在查询数据前我们先清库,然后制造一些样例数据,方便我们理解

g.V().drop()

样例数据(需要一条一条执行)

g.addV('person').property('name','张三').property('age',28).as('张三')
.addV('person').property('name','李四').property('age',12).as('李四')
.addV('person').property('name','王五').property('age',35).as('王五')
.addV('person').property('name','赵六').property('age',46).as('赵六')
.addV('person').property('name','朱七').property('age',70).as('朱七')
.addV('person').property('name','孙八').property('age',70).as('孙八')
.addE('know').from('张三').to('李四').property('knowTime',2018)
.addE('know').from('张三').to('王五').property('knowTime',2021)
.addE('know').from('李四').to('朱七').property('knowTime',2019)
.addE('know').from('赵六').to('王五').property('knowTime',2020)
.addE('know').from('张三').to('孙八').property('knowTime',2015)
.addE('know').from('孙八').to('李四').property('knowTime',2012)

创建完的数据关系是这样

img

g.V()

查出所有的顶点

g.E()

查出所有的边

has查询

1. hasLabel(label)

查询指定label的数据

g.V().hasLabel('person')

查出所有的person的顶点

g.E().hasLabel('know')

查询出所有know的边

2. has(label, property, property-value)

g.V().has("person","name","老王")

查询出所有label是person,name属性是老王的顶点

g.E().has("know","knowTime",2018)

查询所有label是know,并且knowTime属性是2018的边。

更多用法请看官方文档

hasId(id...)

根据id列表查询

g.V().hasId(65624,77952)
posted @ 2022-08-29 10:26  树先生1024  阅读(522)  评论(0编辑  收藏  举报