OrientDB 系列(1) —— 初识 OrientDB

(5) 2024-06-12 18:23

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
OrientDB 系列(1) —— 初识 OrientDB,希望能够帮助你!!!。

初识 OrientDB

文章目录

  • 初识 OrientDB
    • OrientDB 的安装与连接
      • OrientDB 二进制包安装
      • Docker 安装
      • 连接 OrientDB
      • 可视化界面连接
    • OrientDB 的使用
      • 数据库管理
      • 用户管理
      • Classes 操作
      • Cluster 操作
      • 通用 CRUD 操作
        • 插入数据
        • 查询数据
        • 修改数据
        • 删除数据
      • 图操作
        • 创建顶点
        • 删除顶点
        • 创建边
        • 删除边
        • 遍历语句

OrientDB 的安装与连接

OrientDB 二进制包安装

OrientDB 的下载地址: http://www.orientdb.org/download

# 上传并解压压缩包 tar -zxf orientdb-community-3.2.5.tar.gz # 进入启动脚本所在目录 cd orientdb-community-3.2.5/bin/ # 启动 OrientDB ./server.sh # 关闭 OrientDB (请将 root_password 更换为真正的 root 用户密码 ) ./shutdown.sh -p ROOT_PASSWORD 

Ps: 第一次启动是会要求输入 root 用户密码,输入完后会自动保存到配置文件中

Docker 安装

# 拉取镜像 docker pull orientdb:3.2.5 # 通过镜像启动容器 (请将 root 更换为真正的 root 用户密码 ) docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB_ROOT_PASSWORD=root orientdb:3.2.5 

连接 OrientDB

# 进入 OrientDB 所在的解压目录下的脚本文件所在目录 cd orientdb-community-3.2.5/bin/ # 启动连接的控制台 ./console.sh # 在控制台中使用连接命令连接 (本地连接可以直接将 ip 换为 localhost) connect remote:192.168.159.139 root root_password # Ps: OrientDB 默认的连接端口为 2424 

可视化界面连接

OrientDB 的的可视化界面为 http://localhost:2480

Ps 可以根据情况将 localhost 更改为 OrientDB 所安装的服务器的 ip

OrientDB 的使用

OrientDB 系列(1) —— 初识 OrientDB_https://bianchenghao6.com/blog__第1张

  • Class: OrientDB 中的 Class 的概念类似于面向对象编程中的类,用户可以按照需求定义自己需要的属性。Class 一般默认会包含 0~多个 Cluster。创建一个 class 时,一般会创建 8 个 Cluster
  • Cluster: Cluster 一般用于存放多条数据记录,Cluster 可以脱离 Class 而存在。
  • record: 记录一般在 Cluster 中,每一条记录都有一个唯一的 ridrid 一般由 cluser_id 和记录在 cluster 中的位置组成,格式类似于#<cluster_id>:<id>

数据库管理

# 列出所有的数据库 list databases # 创建本地数据库,名为 demo,指定数据库的存储位置 CREATE DATABASE PLOCAL:/usr/local/orientdb/databases/demo # 创建远端数据库,名为 trick,加上用户名密码,存储方式为本地,如果要将数据放入内存中则需将 PLOCAL 改为 MEMORY CREATE DATABASE REMOTE:192.168.1.1/trick root root_pwd PLOCAL # 创建数据库,名为mydb, 加上用户名密码,本地存储方式,数据库模式为图数据库,指定备份目录位置为 /tmp/backup create database remote:localhost/mydb root root_pwd plocal graph -restore=/tmp/backup # 切换到名为 demodb 的数据库,并指定用户名密码 use remote:localhost/demodb root root_pwd # 修改数据库自定义属性(禁用 SQL 严格解析) ALTER DATABASE CUSTOM strictSQL=false # 移除当前正在使用的数据库 DROP DATABASE # 移除远程数据库 DROP DATABASE REMOTE:localhost/demo root root_password 

用户管理

# 创建用户 Foo 密码为 bar 角色为管理员 CREATE USER Foo IDENTIFIED BY bar ROLE admin # 为 Foo 授予集群 account 的 更新权限 GRANT UPDATE ON database.cluster.account TO Foo # 回收 Foo 对所有集群的删除权限 REVOKE DELETE ON database.cluster.* FROM Foo # 删除用户 Foo DROP USER Foo 

权限列表

权限 描述
NONE 该资源上不授予任何权限
CREATE 为该资源授予创建权限,对应为 CREATE 语句和 INSERT
READ 为该资源授予读取权限,对应为 SELECT 语句
UPDATE 为该资源授予更新权限,对应为 UPDATE 语句
DELETE 为该资源授予删除权限,对应为 DROP 语句
ALL 为该资源授予所有权限

资源列表

资源 描述
database 为当前数据库授予权限
database.class. 为数据库中某个类授予权限,使用 * 代表所有的类
database.cluster. 为数据库中某个集群授予权限,使用 * 代表所有的集群
database.query 授予执行查询的能力
database.command. 授予执行语句的权限,
database.config. 授予配置管理能力,合法的权限仅有 READUPDATE
database.hook.record 授予能够设置钩子的能力
server.admin

Classes 操作

Classes 的概念类似于面向对象编程中的 Class。Class 是 OrientDB 中的一个数据模型,他允许用户为记录定义特定的规则。

# 列出所有的 Class list classes # 创建一个学生的类 CREATE CLASS Student # 为学生类添加属性 CREATE PROPERTY Student.name STRING # 为学生类添加属性 CREATE PROPERTY Student.birthDate DATE # 创建属性时添加相应约束 CREATE PROPERTY student.sexuality STRING ( REGEXP "[M|F]") # 为属性添加规则(最短) ALTER PROPERTY Student.name MIN 3 # 为属性添加规则 (强制) ALTER PROPERTY Student.name MANDATORY true # 为属性添加多跳规则 CREATE PROPERTY Student.name STRING (MANDATORY TRUE, MIN 5, MAX 25) # 设置属性的类型为一个嵌入式字符串列表 CREATE PROPERTY Profile.tags EMBEDDEDLIST STRING # 添加一个属性 friends ,用于存放 当前 profile 对象对其他 profile 对象的映射(Profile 也是一个类) CREATE PROPERTY Profile.friends EMBEDDEDMAP Profile # 修改属性名,将 age 修改为 born ALTER PROPERTY Account.age NAME "born" # 将某属性更改为强制填写 ALTER PROPERTY Account.age MANDATORY TRUE # 为某属性设置正则表达式限制 ALTER PROPERTY Account.gender REGEXP "[M|F]" # 为属性设置默认值 ALTER PROPERTY Client.created DEFAULT "sysdate()" # 删除属性 DROP PROPERTY User.name # 移除类中所有记录 TRUNCATE CLASS Profile # 删除类 DROP CLASS Account # 展示学生类类信息 INFO CLASS Student # 展示类的所有数据 BROWSE CLASS Student 

Clsaaes 支持的类型

  • 布尔类型:BOOLEAN
  • 整数类型:INTEGERSHORTLONG
  • 浮点数类型:DOUBLEFLOATDECIMAL
  • 字符串类型:STRING
  • 时间类型:DATEDATETIME
  • 字节类型:BINARYBYTE
  • 嵌入与链接类型:EMBEDDEDLINKLINKBAG
  • 嵌入式集合类型:EMBEDDEDLISTEMBEDDEDSETEMBEDDEDMAP
  • 链式集合类型:LINKLISTLINKSETLINKMAP

Ps:
Embedded 类型的记录会保存在记录本身,并没有 RecordID
Link 是指向其他类型的链接

有关类型的介绍可以参考:https://www.w3cschool.cn/orientdb/orientdb_data_types.html

Cluster 操作

# 往一个类中添加一个 Cluster ALTER CLASS Customer ADDCLUSTER UK_Customers # 查看集合内的所有数据 BROWSE CLUSTER OUser # 修改 Cluster 的名称 ALTER CLUSTER profile NAME "profile2" # 根据 Cluster 的 id 修改 Cluster 的名称 ALTER CLUSTER 9 NAME "profile2" # 修改 Cluster 的冲突策略 ALTER CLUSTER V CONFLICTSTRATEGY "automerge" # 将 Cluster 的状态设置为离线 ALTER CLUSTER V_2012 STATUS "OFFLINE" # 将 Emplyee 为开头的 Cluster 的状态全部设置为离线 ALTER CLUSTER employee* status "offline" # 依据名称删除 Cluster DROP CLUSTER Account # 依据 Cluster-id 删除 Cluster Drop Cluster 177 

通用 CRUD 操作

插入数据
# 往 Profile 类中插入一条数据(SQL-92 规范) INSERT INTO Profile (name, surname) VALUES ('Jay', 'Miner') # 往 Profile 类中插入一条数据 INSERT INTO Profile SET name = 'Jay', surname = 'Miner' # 往 Profile 类中插入一条数据(JSON 格式) INSERT INTO Profile CONTENT {"name": "Jay", "surname": "Miner"} # 将数据插入到 Profile 类的特定 Cluster 中(SQL-92 规范) INSERT INTO Profile CLUSTER profile_recent (name, surname) VALUES ('Jay', 'Miner') # 将数据插入到 Profile 类的特定 Cluster 中 INSERT INTO Profile CLUSTER profile_recent SET name = 'Jay', surname = 'Miner' # 同时向 Profile 类中插入多条数据 INSERT INTO Profile(name, surname) VALUES ('Jay', 'Miner'),('Frank', 'Hermier'), ('Emily', 'Sout') # 插入一条记录并添加一个关系(SQL-92 规范) INSERT INTO Employee (name, boss) VALUES ('jack', #11:09) # 插入一条记录并添加一个关系 INSERT INTO Employee SET name = 'jack', boss = #11:99 # 插入一条记录并添加多条关系(SQL-92 规范) INSERT INTO Profile (name, friends) VALUES ('Luca', [#10:3, #10:4]) # 插入一条记录并添加多条关系 INSERT INTO Profiles SET name = 'Luca', friends = [#10:3, #10:4] # 采用子查询进行数据插入 INSERT INTO Diver SET name = 'Luca', buddy = (SELECT FROM Diver WHERE name = 'Marko') # 往 cluster 中插入一条数据 INSERT INTO CLUSTER:asiaemployee (name) VALUES ('Matthew') # 往某类的其他 Cluster 中插入数据的其他写法 INSERT INTO CLUSTER:asiaemployee (@class, content) VALUES ('Employee', 'Matthew') # 插入数据时还插入一个嵌入式文档 INSERT INTO Profile (name, address) VALUES ('Luca', { "@type": "d", "street": "Melrose Avenue", "@version": 0 }) # 从其他类中复制某些数据 INSERT INTO GermanyClient FROM SELECT FROM Client WHERE country = 'Germany' # 当新类比旧类多出一个 bool 属性时,从旧类中复制数据到新类中 INSERT INTO GermanyClient FROM SELECT *, true AS copied FROM Client WHERE country = 'Germany' 
查询数据
# 查出类中所有数据 SELECT FROM Person # 按名称进行模糊查询 SELECT FROM Person WHERE name LIKE 'Luk%' # 查询名称前三个为 Luk 的 SELECT FROM Person WHERE name.left(3) = 'Luk' # 同上 SELECT FROM Person WHERE name.substring(0,3) = 'Luk' # 获取 Profile 类中任一属性含有 danger 字段的所有记录 SELECT FROM Profile WHERE ANY() LIKE '%danger%' # 输出 Profile 类的特定字段 SELECT nick, followings, followers FROM Profile # 对需要的字段进行特殊处理后输出 SELECT name.toUppercase(), address.city.country.name FROM Profile # 依据 rid 输出相关记录 SELECT FROM [#10:3, #10:4, #10:5] # 查询后对结果进行排序 SELECT FROM Profile ORDER BY name DESC # 依据 Account 类的 city 属性进行分组,并统计其中个数 SELECT SUM(*) FROM Account GROUP BY city # 通过索引进行检索 select from index:ouser.name where key = 'admin' # 从某一节点开始,在十层关系或链接对象之内,寻找带有 address.city 为 rome 的记录 # 或者说是从某一节点开始遍历。 SELECT FROM 11:4 WHERE ANY() TRAVERSE(0,10) (address.city = 'Rome') # 返回记录,该纪录的三层连接里里面,含有属性 danger SELECT FROM Profile WHERE ANY() TRAVERSE(0, 3) ( ANY().toUpperCase().indexOf('danger') > -1 ) 
修改数据
# 依据条件更改数据 UPDATE Profile SET nick = 'Luca' WHERE nick IS NULL # 从所有记录中移除某字段 UPDATE Profile REMOVE nick # 往集合中添加一个引用值(链接) UPDATE Account ADD address=#12:0 # 移除集合中的一个引用值(链接) UPDATE Account REMOVE address = #12:0 # 移除集合中的一个 String 类型的值 UPDATE Account REMOVE addresses = 'Foo' # 按条件移除列表中的特定元素 UPDATE Account REMOVE addresses = addresses[city = 'Rome'] # 移除列表中特定位置元素 UPDATE Account REMOVE addresses = addresses[1] # 将一个数据放入到一个 map 中 UPDATE Account PUT addresses = 'Luca', #12:0 # 移除 map 中的一个元素 UPDATE Account REMOVE addresses = 'Luca' # 插入一个 嵌入式文档 UPDATE Account SET address={ "street": "Melrose Avenue", "city": { "name": "Beverly Hills" } } # 更新 20 条满足条件的记录 UPDATE Profile SET nick = 'Luca' WHERE nick IS NULL LIMIT 20 
删除数据
# 依据条件删除数据 DELETE FROM Profile WHERE surname.toLowerCase() = 'unknown' 

图操作

创建顶点
# 创建一个顶点类 V1 并继承顶点基类 V CREATE CLASS V1 EXTENDS V # 创建一个 V1 类顶点 CREATE VERTEX V1 # 创建一个 V1 类顶点并为其指定特定 Cluster CREATE VERTEX V1 CLUSTER recent # 创建顶点并设置属性 CREATE VERTEX SET brand = 'fiat' # 创建 V1 类顶点并设置属性 CREATE VERTEX V1 SET brand = 'fiat', name = 'wow' # 使用 JSON 内容创建顶点 CREATE VERTEX Employee CONTENT { "name" : "Jay", "surname" : "Miner" } 
删除顶点
# 依据 id 删除顶点 DELETE VERTEX #10:231 # 依据属性删除顶点 DELETE VERTEX EMailMessage WHERE isSpam = TRUE # 依聚其他顶点的类来删除顶点 DELETE VERTEX Account WHERE in.@Class CONTAINS 'BadBehaviorInForum' # 依据连续的两条边的类型进行查询 DELETE VERTEX Attachment WHERE in[@Class = 'HasAttachment'].date <= "1990" AND in.out[@Class = "Email"].from = 'some...@example.com' # 一次删除 1000 条数据 DELETE VERTEX v BATCH 1000 
创建边
# 创建一条普通的边 CREATE EDGE FROM #10:3 TO #11:4 # 创建一个新的边类 E1 并继承边的基类 CREATE CLASS E1 EXTENDS E # 创建一条 E1 边的类 CREATE EDGE E1 FROM #10:3 TO #11:4 # 往指定的 Cluster 中插入一条边 CREATE EDGE E1 CLUSTER EuropeEdges FROM #10:3 TO #11:4 # 创建边,并且为边设置属性 CREATE EDGE FROM #10:3 TO #11:4 SET brand = 'fiat' # 创建边并设置多个属性 CREATE EDGE E1 FROM #10:3 TO #11:4 SET brand = 'fiat', name = 'wow' # 根据条件创建边 CREATE EDGE Watched FROM (SELECT FROM account WHERE name = 'Luca') TO (SELECT FROM movies WHERE type.name = 'action') # 使用 JSON 格式为边插入数据 CREATE EDGE E FROM #22:33 TO #22:55 CONTENT { "name": "Jay", "surname": "Miner" } 
删除边
# 依据 rid 删除边 DELETE EDGE #22:38482 # 依据多个 rid 删除边 DELETE EDGE [#22:38482,#23:232,#33:2332] # 依据起点终点和条件删除边 DELETE EDGE FROM #11:101 TO #11:117 WHERE date >= "2012-01-15" # 依据类型和属性删除边 DELETE EDGE FROM #11:101 TO #11:117 WHERE @class = 'Owns' AND comment LIKE "regex of forbidden words" # 依据类型和属性删除边 DELETE EDGE Owns WHERE date < "2011-11" # 批量删除一千条数据 DELETE EDGE Owns WHERE date < "2011-11" BATCH 1000 # 删除所有的基类 E 的边 DELETE EDGE E WHERE @rid IN (SELECT @rid FROM E) 
遍历语句
# 从根节点遍历所有的字段 TRAVERSE * FROM #10:1234 # 从根节点开始遍历,指定深度和边的类型,并指定采用广度优先策略 TRAVERSE out("Friend") FROM #10:1234 MAXDEPTH 3 STRATEGY BREADTH_FIRST # 对遍历的深度进行筛选输出 SELECT FROM (TRAVERSE out("Friend") FROM #10:1234 MAXDEPTH 3) WHERE $depth >= 1 # 对遍历的结果进行筛选输出 SELECT FROM (TRAVERSE out("Friend") FROM #10:1234 MAXDEPTH 3) WHERE city = 'Rome' # 以满足要求的部分节点为起点进行遍历,并筛选输出相关的类 SELECT FROM (TRAVERSE out("Actors"), out("Movies") FROM (SELECT FROM Movie WHERE producer = "J.J. Abrams") MAXDEPTH 3) WHERE @class = 'Movie' # 展示遍历的步骤 SELECT $path FROM ( TRAVERSE out() FROM V MAXDEPTH 10 ) # 两步 follow 遍历 SELECT FROM (TRAVERSE out('follow') FROM TwitterAccounts MAXDEPTH 2 ) WHERE $depth = 2 # 两步 follow 遍历 SELECT out('follow').out('follow') FROM TwitterAccounts 

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复