图数据库入门教程(四)基本概念和基本操作
涉及的语法,关于语法更多的使用方式参考官方文档
- addV
- addE
- g.V()
- g.E()
- has相关
1. 基本概念
注意,现在不要拘泥于下面例子中语句中的具体语法,先做整体理解
1. Vertex(顶点)
顶点,表示一个数据节点,它一般对应一个实体,比如一个公司、一个人、一个产品、一本书等
创建一个"人"顶点:一个18岁的老王,是一个人'person'
g.addV('person').property('name','老王').property('age',18)
在gdotv中执行上面的语句,返回数据如下图
可以看到有三个视图:
QUERY OUTPUT:查询结果视图,这里展示 gremlin console输出和 json输出,gremlin console的输出可以简单的理解为返回的是顶点对象,如上图v[1642640],代表这是一个顶点,它的id是1642640
GRAPH VIEW:图结果视图,这里展示当前结果的图
默认情况下gdotv顶点图展示的是label+id,要想让顶点上展示老王(name),需要设置一下
1.点击顶点,再点击右侧出来的调色板图标
VERTEX VIEW:顶点视图,这里展示查询结果顶点列表(会自动去重)
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的边(关系)
Id
表示边的id,此处是自动生成
Label
边的标签,一个边可以没有或只能有一个标签,代表边点的的分类,可以理解为关系型数据库的表名称。
Property
顶点的属性,我们此处建了一个属性:knowTime(认识时间),其他字段比如In Vertex Id
、Out 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)
创建完的数据关系是这样
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)