Tutorialspoint OrientDB 教程

来源：易百教程

OrientDB教程™

OrientDB是一个开源的NoSQL数据库管理系统，它包含了传统DBMS的功能以及Document和Graph DBMS的新功能。 它是使用Java编写的，处理数据的速度非常快。 它在商品硬件上每秒可存储220,000条记录。

在本教程的以下章节中，我们将介绍OrientDB，它是最好的开源多模式下一代NoSQL产品之一。

面向读者

本教程适用于愿意通过简单易行的步骤学习NoSQL数据库的软件专业人员。 通过本教程的学习，您将对OrientDB概念有一个很好的理解。

前提条件

OrientDB是NoSQL数据库技术，处理文档，图形和传统数据库组件，如模式和关系。 因此，最好有SQL的知识。 熟悉NoSQL是一个额外的优势。

问题反馈

我们不能保证您在学习此OrientDB教程的过程中不会遇到任何问题。本教程中的讲解，示例和代码等只是根据作者的理解来概括写出。由于作者水平和能力有限，因此不保正所有编写的文章都准确无误。但是如果有遇到任何错误或问题，请反馈给我们，我们会及时纠正以方便后续读者阅读。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB简介 - OrientDB教程™

OrientDB是一个开源的NoSQL数据库管理系统。 NoSQL数据库提供了一种机制，用于存储和检索引用非表格数据(如文档数据或图形数据)之外的数据的非关系或非关系数据。 大数据和实时Web应用程序越来越多地使用NoSQL数据库。 NoSQL系统有时也被称为“Not Only SQL”，以强调它们可能支持类似SQL的查询语言。

OrientDB也属于NoSQL系列。 OrientDB是第二代分布式图形数据库，在一个产品中具有灵活的文档功能，并使用开放的Apache 2许可证发布。 在OrientDB之前市场上有几个NoSQL数据库，其中之一是MongoDB。

MongoDB与OrientDB

MongoDB和OrientDB包含许多共同的功能，但引擎是根本不同的。 MongoDB是纯文档数据库，OrientDB是一个带图形引擎的混合文档。

特征 | MongoDB | OrientDB
关系 | 使用RDBMS JOINS创建实体之间的关系。 它具有较高的运行时成本，并且在数据库规模增加时不会进行扩展。 | 使用关系数据库来连接和连接文档。 它使用来自图形数据库世界的直接，超快链接。
获取计划 | 昂贵的JOIN操作。 | 轻松地返回完整的图形与相互关联的文件。
事务 | 不支持ACID事务，但它支持原子操作。 | 支持ACID事务以及原子操作。
查询语言 | 拥有基于JSON的自己的语言。 | 查询语言建立在SQL上。
索引 | 对所有索引使用B-Tree算法。 | 支持三种不同的索引算法，以便用户可以获得最佳性能。
存储引擎 | 使用内存映射技术。 | 使用存储引擎名称LOCAL和PLOCAL。

OrientDB是第一款多模型开源NoSQL DBMS，它将图形的强大功能和文档的灵活性集成到一个可扩展的高性能操作数据库中。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB安装 - OrientDB教程™

OrientDB安装文件有两个版本 -

社区版 - OrientDB社区版根据Apache 2许可证发布。

企业版 - OrientDB企业版作为专有软件发布，基于社区版。 它作为社区版的扩展。

本章介绍OrientDB社区版的安装过程。

前提条件

社区版和企业版都可以在任何实现Java虚拟机(JVM)的操作系统上运行。 OrientDB需要1.7或更高版本的Java。

使用以下步骤将OrientDB下载并安装到您的系统中。

第1步 - 下载OrientDB二进制安装文件

OrientDB带有内置的安装文件，用于在系统上安装数据库。 它为不同的操作系统提供不同的预编译二进制包(tar或压缩包)。 可以从下载OrientDB链接( http://orientdb.com/download/ )下载OrientDB文件。

以下屏幕截图显示的是OrientDB的下载页面。可以通过单击适合的操作系统图标来下载压缩文件或tar文件。

下载时，您将在您的Downloads文件夹中获得二进制包。

第2步 - 提取并安装OrientDB

以下是为不同操作系统提取和安装OrientDB的过程。

在Linux中
下载后，您将在下载文件夹中获得orientdb-community-2.1.9.tar.gz文件。可以使用以下命令来提取tar文件。

$ tar –zxvf orientdb-community-2.1.9.tar.gz

可以使用以下命令将OrientDBcommunity-2.1.9中的所有OrientDB库文件移动到/opt/orientdb/目录。 这里使用超级用户命令(sudo)，因此您必须提供超级用户密码才能执行以下命令。

$ sudo mv orientdb-community-2.1.9 /opt/orientdb

可以使用以下命令来注册orientdb命令和Orient服务器。

$ export ORIENTDB_HoME = /opt/orientdb
$ export PATH = $PATH:$ORIENTDB_HOME/bin

在Windows系统中

下载后，将获得orientdb-community-2.1.9.zip文件。 使用zip提取器提取zip文件。

将提取的文件夹移动到 D:\software 目录中。

使用以下给定值创建两个环境变量ORIENTDB_HOME和PATH变量。

ORIENT_HOME = D:\softwar\orientdb-community-2.1.9
PATH = D:\softwar\orientdb-community-2.1.9\bin

第3步 - 将OrientDB服务器配置为服务

按照上述步骤，可以使用OrientDB的Windows版本。 使用以下步骤将OrientDB数据库服务器作为服务启动。 程序可能不同，具体取决于您的操作系统。

在Linux系统中
OrientDB提供了一个名为orientdb.sh的脚本文件作为守护程序运行数据库。 可以在OrientDB安装目录的bin/目录中找到它，它完整文件路径是:$ORIENTDB_HOME/bin/orientdb.sh。

在运行脚本文件之前，必须编辑orientdb.sh文件以定义两个变量。 一个是定义安装目录路径(/opt/orientdb)的ORIENTDB_DIR，另一个是定义您想要运行OrientDB的用户名的ORIENTDB_USER，如下所示。

ORIENTDB_DIR = "/opt/orientdb"
ORIENTDB_USER = "<username you want to run OrientDB>"

使用以下命令将orientdb.sh文件复制到/etc/init.d/目录中以初始化并运行脚本。 这里我们使用超级用户命令(sudo)，因此您必须提供超级用户密码才能执行以下命令。

$ sudo cp $ORIENTDB_HOME/bin/orientdb.sh /etc/init.d/orientdb

使用以下命令将OrientDB安装目录($ORIENTDB_HOME/bin)中的console.sh文件复制到系统bin目录(/usr/bin)以访问Orient DB的控制台。

$ sudo cp $ ORIENTDB_HOME/bin/console.sh /usr/bin/orientdb

使用以下命令将ORIENTDB数据库服务器作为服务启动。 在这里，必须提供您在orientdb.sh文件中提到的用于启动服务器的相应用户密码。

$ service orientdb start

使用以下命令知道OrientDB服务器守护程序正在运行的PID。

$ service orientdb status

使用以下命令停止OrientDB服务器守护进程。 在这里必须提供相应的用户密码来停止服务器。

$ service orientdb stop

在Windows中

OrientDB是一个服务器应用程序，因此它必须在开始关闭Java虚拟机进程之前执行几个任务。 如果想手动关闭OrientDB服务器，那么你必须执行shutdown.bat文件。 但是，当系统突然关闭而不执行上述脚本时，服务器实例不能正确停止。 操作系统使用一组指定信号控制的程序在Windows中称为服务。

必须使用Apache Common Daemon，它允许Windows用户将Java应用程序封装为Windows服务。 以下是下载和注册Apache通用守护程序的过程。

点击以下链接以查看Windows的Apache Common Daemons。

点击common-daemon-1.0.15-bin-windows下载。

解压common-daemon-1.0.15-bin-windows目录。 解压缩后，将在目录中找到prunsrv.exe和prunmgr.exe文件。

prunsrv.exe文件是用于将应用程序作为服务运行的服务应用程序。

prunmgr.exe文件是用于监视和配置Windows服务的应用程序。

转到OrientDB安装文件夹→创建一个新目录并命名它的服务。

将prunsrv.exe和prunmgr .exe复制到服务目录中。

要将OrientDB配置为Windows服务，必须执行一个使用prusrv.exe作为Windows服务的短脚本。

在定义Windows服务之前，必须根据服务的名称重命名prunsrv和prunmgr。 对于例如 OrientDBGraph和OrientDBGraphw。 这里OrientDBGraph是服务的名称。

或者直接进入解压安装的目录:D:\software\orientdb\bin，执行 -

D:\software\orientdb\bin> server.bat

2018-05-02 09:01:31:696 INFO  OrientDB Server v2.2.34 (build f340442755a31eabc91b87cb3ef99eda5cee6ebd, branch 2.2.x) is starting up...
2018-05-02 09:01:31:742 INFO  Databases directory: D:\software\orientdb\databases
2018-05-02 09:01:31:852 INFO  Configuration of usage of soft references inside of containers of results of SQL execution
2018-05-02 09:01:31:971 INFO  Initial and maximum values of heap memory usage are equal, containers of results of SQL executors will use soft references by default
2018-05-02 09:01:31:972 INFO  Auto configuration of disk cache size.
2018-05-02 09:01:32:182 INFO  4201885696 B/4007 MB/3 GB of physical memory were detected on machine
2018-05-02 09:01:32:182 INFO  Detected memory limit for current process is 4201885696 B/4007 MB/3 GB
2018-05-02 09:01:32:182 WARNI Not enough physical memory available for DISKCACHE: 4,007MB (heap=2,048MB direct=524,288MB). Set lower Maximum Heap (-Xmx setting on JVM) and restart OrientDB. Now running with DISKCACHE=256MB
2018-05-02 09:01:32:182 INFO  OrientDB config DISKCACHE=256MB (heap=2,048MB direct=524,288MB os=4,007MB)
2018-05-02 09:01:32:483 INFO  {db=OSystem} Creating the system database 'OSystem' for current server
2018-05-02 09:01:35:149 INFO  Storage 'plocal:D:/software/orientdb/databases/OSystem' is created under OrientDB distribution : 2.2.34 (build f340442755a31eabc91b87cb3ef99eda5cee6ebd, branch 2.2.x)
2018-05-02 09:01:45:613 INFO  Listening binary connections on 0.0.0.0:2424 (protocol v.36, socket=default)
2018-05-02 09:01:45:613 INFO  Listening http connections on 0.0.0.0:2480 (protocol v.10, socket=default)

+---------------------------------------------------------------+
|                WARNING: FIRST RUN CONFIGURATION               |
+---------------------------------------------------------------+
| This is the first time the server is running. Please type a   |
| password of your choice for the 'root' user or leave it blank |
| to auto-generate it.                                          |
|                                                               |
| To avoid this message set the environment variable or JVM     |
| setting ORIENTDB_ROOT_PASSWORD to the root password to use.   |
+---------------------------------------------------------------+

Root password [BLANK=auto generate it]: *******
*Please confirm the root password: *******
*
2018-05-02 09:02:11:945 INFO  Installing dynamic plugin 'orientdb-etl-2.2.34.jar'...
2018-05-02 09:02:11:960 INFO  Installing dynamic plugin 'orientdb-neo4j-importer-plugin-2.2.34-dist.jar'...
2018-05-02 09:02:11:960 INFO  Installing dynamic plugin 'orientdb-studio-2.2.34.zip'...
2018-05-02 09:02:11:976 INFO  Installing dynamic plugin 'orientdb-teleporter-2.2.34.jar'...
2018-05-02 09:02:12:007 INFO  ODefaultPasswordAuthenticator is active
2018-05-02 09:02:12:023 INFO  OServerConfigAuthenticator is active
2018-05-02 09:02:12:023 INFO  OSystemUserAuthenticator is active
2018-05-02 09:02:12:038 INFO  Installed GREMLIN language v.2.6.0 - graph.pool.max=50
2018-05-02 09:02:12:038 INFO  [OVariableParser.resolveVariables] Error on resolving property: distributed
2018-05-02 09:02:12:038 WARNI Authenticated clients can execute any kind of code into the server by using the following allowed languages: [sql]
2018-05-02 09:02:12:290 INFO  OrientDB Studio available at http://192.168.0.55:2480/studio/index.html
2018-05-02 09:02:12:290 INFO  OrientDB Server is active v2.2.34 (build f340442755a31eabc91b87cb3ef99eda5cee6ebd, branch 2.2.x).

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB基本概念 - OrientDB教程™

OrientDB的主要功能是支持多模型对象，即支持不同的模型，如文档，图形，键/值和实体对象。 它包含一个单独的API来支持所有这四种模型。

文档模型

术语文档模型属于NoSQL数据库。 这意味着数据存储在文档中，并且该组文档被称为集合。 从技术上讲，文档表示一组键/值对或者也称为字段或属性。

OrientDB使用类，簇和链接等概念来存储，分组和分析文档。

下表说明了关系模型，文档模型和OrientDB文档模型之间的比较 -

关系模型 | 文档模型 | OrientDB文档模型
表 | 集合 | 类或簇
行 | 文档 | 文档
列 | 键/值对 | 文档字段
关系 | 无法使用 | 链接

图模型

图形数据结构是一种数据模型，可以按照边(弧)互连的顶点(节点)形式存储数据。 OrientDB图形数据库的思想来自属性图。 顶点和边是Graph模型的主要构件。 它们包含的属性可以使这些属性与文档类似。

下表显示了图形模型，关系数据模型和OrientDB图形模型之间的比较。

关系模型 | 图模型 | OrientDB图形模型
表 | 顶点和边缘类 | 扩展“V”(用于顶点)和“E”(用于边缘)的类
行 | 顶点 | 顶点
列 | 顶点和边缘属性 | 顶点和边缘属性
关系 | 边缘 | 边缘

键/值模型

键/值模型意味着数据可以以键/值对的形式存储，其中值可以是简单和复杂的类型。 它可以支持文档和图形元素作为值。

下表说明了关系模型，键/值模型和OrientDB键/值模型之间的比较。

关系模型 | 键/值模型 | OrientDB键/值模型
表 | Bucket | 类或集群
行 | 键/值对 | 文档
列 | 不可用 | 文档字段或顶点/边缘属性
关系 | 不可用 | 链接

对象模型

此模型已由面向对象编程继承，并支持类型之间的继承(子类型扩展超类型)，引用基类时的多态性和编程语言中使用的对象之间的直接绑定。

下表说明了关系模型，对象模型和OrientDB对象模型之间的比较。

关系模型 | 对象模型 | OrientDB对象模型
表 | 类 | 类或簇
行 | 对象 | 文档或顶点
列 | 对象属性 | 文档字段或顶点/边缘属性
关系 | 指针 | 链接

在详细介绍之前，最好了解与OrientDB相关的基本术语。 以下是一些重要的术语。

记录

可以从数据库中加载并存储的最小单位。 记录可以存储在四种类型中。

文件

记录字节

顶点

边缘

记录ID

OrientDB生成记录时，数据库服务器会自动为记录分配一个单元标识符，称为RecordID(RID)。 RID看起来像＃<cluster>:<position>。 <cluster>表示簇标识号，<position>表示簇中记录的绝对位置。

文档

文档是OrientDB中最灵活的记录类型。 文档是软输入的，由具有已定义约束的模式类定义，但您也可以在不使用任何模式的情况下插入文档，即它也支持无模式模式。

可以通过导出和导入JSON格式轻松处理文档。 例如，看看下面的JSON示例文档。 它定义了文档的详细信息。

{
   "id"        : "1201",
   "name"      : "Jay",
   "job"       : "Developer",
   "creations" : [
      {
         "name"    : "Amiga",
         "company" : "Commodore Inc."
      },

      {
         "name"    : "Amiga 500",
         "company" : "Commodore Inc."
      }
   ]
}

RecordBytes

记录类型与RDBMS中的BLOB类型相同。 OrientDB可以加载和存储文档记录类型以及二进制数据。

顶点
OrientDB数据库不仅是一个文档数据库，也是一个图形数据库。 Vertex和Edge等新概念用于以图形的形式存储数据。 在图形数据库中，最基本的数据单元是节点，它在OrientDB中称为顶点。 顶点存储数据库的信息。

边缘

有一个独立的记录类型称为Edge，它将一个顶点连接到另一个顶点。 边是双向的，只能连接两个顶点。 OrientDB中有两种边缘类型，一种是常规的，另一种是轻量级的。

类

该类是一种数据模型和从面向对象编程范例中绘制的概念。 基于传统的文档数据库模型，数据以集合的形式存储，而在关系数据库模型中，数据存储在表中。 OrientDB遵循Document API和OPPS范例。 作为一个概念，OrientDB中的类与关系数据库中的表有最密切的关系，但是(不像表)类可以是无模式，全模式或混合的。 类可以从其他类继承，创建类的树。 每个类都有自己的一个或多个集群(如果没有定义，则默认创建)。

簇
集群是用于存储记录，文档或顶点的重要概念。 简而言之，Cluster是存储一组记录的地方。 默认情况下，OrientDB将为每个类创建一个群集。 一个类的所有记录都存储在与该类具有相同名称的同一个群集中。最多可以在数据库中创建32,767(2 ^ 15-1)个群集。

CREATE类是用于创建具有特定名称的集群的命令。 创建群集后，可以使用群集通过在创建任何数据模型期间指定名称来保存记录。

关系

OrientDB支持两种关系:引用和嵌入。 引用关系意味着它存储与关系的目标对象的直接链接。 嵌入式关系意味着它将关系存储在嵌入它的记录中。 这种关系比参考关系更强。

数据库
数据库是访问真实存储的接口。 IT人员理解高级概念，如查询，模式，元数据，索引等。 OrientDB还提供多种数据库类型。 有关这些类型的更多信息，请参阅数据库类型。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB数据类型 - OrientDB教程™

OrientDB本地支持多种数据类型。 以下表格列出完整的类型。

编号 | 类型 | 描述
1 | Boolean | 只处理True或False值。对应Java类型:java.lang.Boolean
2 | Integer | 32位有符号整数。对应Java类型:java.lang.Integer
3 | Short | 16位有符号整数。对应Java类型:java.lang.short
4 | Long | 64位有符号整数。 对应Java类型:java.lang.Long
5 | Float | 十进制数字。对应Java类型:java.lang.Float
6 | Double | 高精度的十进制数字。 对应Java类型:Java.lang.Double。
7 | Date-time | 精确到几毫秒的日期。对应Java类型:java.util.Date
8 | String | 任何字符串作为字母数字序列的字符。对应Java类型:java.lang.String
9 | Binary | 可以包含任何值作为字节数组。对应Java类型:byte []
10 | 嵌套 | 记录包含在所有者的内部。包含的记录没有RecordId。Java类型:ORecord
11 | 嵌套列表 | 记录包含在所有者内部。 包含的记录没有RecordIds，只有通过浏览所有者记录才能访问。Java类型:List <objects>
12 | 嵌套集合 | 记录包含在所有者内部。 包含的记录没有RecordId，只有通过浏览所有者记录才能访问。Java类型:set <objects>
13 | 嵌套映射 | 记录作为条目的值包含在所有者中，而键只能是字符串。 包含的记录没有RecordId，只有通过浏览所有者记录才可以访问。对应Java类型: Map<String, ORecord>
14 | 链接 | 链接到另一个记录。 这是一种常见的一对一关系。Java类型: ORID, <? extends ORecord>
15 | 链表 | 链接到其他记录。 这是一种常见的一对多关系，只存储RecordIds。对应Java数据类型: List<? Extends ORecord>
16 | 链接集合 | 链接到其他记录。 这是一种常见的一对多关系。Java类型:Set <？ Extends ORecord>
17 | 链接映射 | 链接到其他记录作为条目的值，而键只能是字符串。 这是一种常见的一对多关系。 只有RecordIds被存储。对应Java数据类型: Map<String, ? extends Record>
18 | Byte | 单字节。 用于存储小型8位有符号整数。对应Java数据类型: java.lang.Byte
19 | Transient | 任何未存储在数据库上的值。
20 | Date | 任何日期，如年，月和日。对应Java类型:java.util.Date
21 | Custom | 用于存储提供Marshall和Unmarshall方法的自定义类型。对应Java类型:OSerializableStream
22 | Decimal | 十进制数字不舍入。 对应Java类型:java.math.BigDecimal
23 | LinkBag | RecordIds列表作为特定的RidBag。对应Java类型:ORidBag
24 | Any | 不确定类型，用于指定混合类型的集合，以及null。

在下面的章节中，将讨论如何在OrientDB中使用这些数据类型。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB控制台模式 - OrientDB教程™

OrientDB控制台是针对OrientDB数据库和服务器实例的Java应用程序。 OrientDB支持几种控制台模式。

交互模式

这是默认模式。 只需通过执行以下脚本bin/console.sh(或MS Windows系统中的bin/console.bat)来启动控制台。 确保有执行权限。

OrientDB console v.1.6.6 www.orientechnologies.com
Type 'help' to display all the commands supported.

orientdb>

完成后，控制台已准备好接受命令。

批处理模式

要以批处理模式执行命令，请运行以下bin/console.sh(或MS Windows系统中的bin/console.bat)脚本，以便以分号;分隔所有命令。

orientdb> console.bat "connect remote:localhost/demo;select * from profile"

或者调用控制台脚本以包含要执行的命令列表的文本格式传递文件的名称。 命令必须用分号;分隔。

示例

假设文件:command.txt包含要通过OrientDB控制台执行的命令列表。 以下命令接受来自command.txt文件的一批命令。

orientdb> console.bat commands.txt

在批处理模式下，可以忽略错误以通过将ignoreErrors变量设置为true来让脚本继续执行。

orientdb> set ignoreErrors true

启用Echo

当您在管道中运行控制台命令时，需要显示它们。 通过在开始处将其设置为属性来启用命令的“回显”。 以下是在OrientDB控制台中启用echo属性的语法。

orientdb> set echo true

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB数据库命令

OrientDB创建数据库 - OrientDB教程™

OrientDB数据库的SQL参考提供了几个命令来创建，更改和删除数据库。

以下语句是创建数据库命令的基本语法。

CREATE DATABASE <database-url> [<user> <password> <storage-type> [<db-type>]]

以下是有关上述语法中选项的详细信息。

<database-url> - 定义数据库的URL。 URL包含两部分，第一部分是<mode>，第二部分是<path>。

<mode> - 定义模式，即本地模式或远程模式。

<path> - 定义数据库的路径。

<user> - 定义要连接到数据库的用户。

<password> - 定义连接到数据库的密码。

<storage-type> - 定义存储类型。可以选择PLOCAL和MEMORY。

示例

可以使用以下命令来创建名为demo的本地数据库。

Orientdb> CREATE DATABASE PLOCAL:/opt/orientdb/databses/demo

如果数据库成功创建， 将会看到类似下面的输出 -

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB修改数据库 - OrientDB教程™

数据库是具有不同属性的重要数据模型之一，您可以根据需要修改它们。

以下语句是Alter Database命令的基本语法。

ALTER DATABASE <attribute-name> <attribute-value>

其中<attribute-name>定义了要修改的属性，<attribute-value>定义了要为该属性设置的值。

下表定义了用于更改数据库的受支持属性的列表。

编号 | 属性名称 | 描述
1 | STATUS | 定义不同属性之间的数据库状态。
2 | IMPORTING | 设置导入状态。
3 | DEFAULTCLUSTERID | 使用ID设置默认群集。 默认情况下是2。
4 | DATEFORMAT | 将特定的日期格式设置为默认值。 默认情况下是yyyy-MM-dd。
5 | DATETIMEFORMAT | 将特定的日期时间格式设置为默认值。 默认情况下是yyyy-MM-dd HH:mm:ss。
6 | TIMEZONE | 设置特定的时区。 默认情况下，它是Java虚拟机(JVM)默认时区。
7 | LOCALECOUNTRY | 设置默认的语言环境国家。 默认情况下，它是JVM的默认语言环境国家。 例如:GB。
8 | LOCALELANGUAGE | 设置默认的语言环境语言。 默认情况下，它是JVM的默认语言环境语言。 例如:en。
9 | CHARSET | 设置字符集的类型。 默认情况下，它是JVM的默认字符集。 例如:utf8。
10 | CLUSTERSELECTION | 设置用于选择群集的默认策略。 这些策略与创建类一起创建。 支持的策略是默认，循环和均衡。
11 | MINIMUMCLUSTERS | 设置创建新类时自动创建的最小群集数。 默认情况下是1。
12 | CUSTOM | 设置自定义属性。
13 | VALIDATION | 禁用或启用整个数据库的验证。

实例

从OrientDB-2.2的版本中，添加了新的SQL解析器，在某些情况下不允许使用常规语法。 因此，在某些情况下，我们必须禁用新的SQL解析器(StrictSQL)。 可以使用以下Alter database命令来禁用StrictSQL分析器。

orientdb> ALTER DATABASE custom strictSQL = false

如果命令执行成功，您将得到以下输出。

orientdb {db=demo}> ALTER DATABASE custom strictSQL = false

Database updated successfully.

orientdb {db=demo}>

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB备份数据库 - OrientDB教程™

和RDBMS一样，OrientDB也支持备份和恢复操作。 在执行备份操作时，它将使用ZIP算法将当前数据库的所有文件转换为压缩的zip格式。 通过启用自动备份服务器插件，可以自动利用此功能(备份)。

但是，根据必须知道何时使用备份以及何时使用导出的过程，对数据库进行备份或导出数据库是相同的。

在进行备份时，它会创建一个数据库的一致副本，所有进一步的写入操作都会被锁定并等待完成备份过程。 在这个操作中，它将创建一个只读的备份文件。

如果在进行备份时需要并发读取和写入操作，则必须选择导出数据库而不是备份数据库。 导出不会锁定数据库，并允许在导出过程中进行并发写入。

以下语句是数据库备份的基本语法。

./backup.sh <dburl> <user> <password> <destination> [<type>]

以下是有关上述语法中选项的详细信息。

<dburl> - 数据库位于本地或远程位置的数据库URL。

<user> - 指定运行备份的用户名。

<password> - 指定用户的密码。

<destination> - 目标文件位置，说明存储备份zip文件的位置。

<type> - 可选的备份类型。它有两种选择之一。

Default - 在备份过程中锁定数据库。

LVM - 在后台使用LVM写时复制快照。

示例

将位于本地文件系统/opt/orientdb/databases/demo中的数据库演示文件备份到名为sample-demo.zip的文件中，并位于当前目录中。

可以使用以下命令来备份数据库演示。

$ backup.sh plocal: opt/orientdb/database/demo admin admin ./backup-demo.zip

使用控制台

可以使用OrientDB控制台进行同样的操作。在进行特定数据库的备份之前，必须先连接到数据库。 可以使用以下命令连接到名为demo的数据库。

orientdb> CONNECT PLOCAL:/opt/orientdb/databases/demo admin admin

连接后，可以使用以下命令将数据库备份到当前目录中名为'backup-demo.zip'的文件中。

orientdb {db=demo}> BACKUP DATABASE ./backup-demo.zip

如果此命令执行成功，您将收到一些成功通知以及以下消息。

Backup executed in 0.18 seconds

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB恢复数据库 - OrientDB教程™

就像RDBMS一样，OrientDB也支持恢复操作。 只有从控制台模式中，您才能成功执行此操作。

以下语句是恢复操作的基本语法。

orientdb> RESTORE DATABSE <url of the backup zip file>

示例

只能从控制台模式执行此操作。 因此，首先必须使用以下OrientDB命令启动OrientDB控制台。

D:\software\orientdb\bin> orientdb.bat

然后，连接到相应的数据库以恢复备份。 可以使用以下命令连接到名为demo的数据库。

orientdb> CONNECT PLOCAL:/opt/orientdb/databases/demo admin admin

连接成功后，可以使用以下命令从'backup-demo.zip'文件恢复备份。在执行之前，请确保backup-demo.zip文件位于当前目录中。

Orientdb {db = demo}> RESTORE DATABASE backup-demo.zip

如果此命令执行成功，将收到一些成功通知以及以下消息。

Database restored in 0.26 seconds

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB连接数据库 - OrientDB教程™

本章介绍如何从OrientDB命令行连接到特定数据库。 它打开一个数据库。

以下语句是Connect命令的基本语法。

CONNECT <database-url> <user> <password>

以下是有关上述语法中选项的详细信息。

<database-url> - 定义数据库的URL。 URL包含两部分，第一部分是<mode>，第二部分是<path>。

<mode> - 定义模式，即本地模式或远程模式。

<path> - 定义数据库的路径。

<user> - 定义要连接到数据库的用户。

<password> - 定义连接到数据库的密码。

示例

我们已经在前面的章节中创建了一个名为“demo”的数据库。 在这个例子中，将使用admin用户连接到demo数据库。

可以使用以下命令连接到demo数据库。

orientdb> CONNECT PLOCAL:/opt/orientdb/databases/demo admin admin

如果连接成功，将获得以下输出 -

Connecting to database [plocal:/opt/orientdb/databases/demo] with user 'admin'…OK
Orientdb {db = demo}>

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB断开数据库连接 - OrientDB教程™

本章介绍如何从OrientDB命令行断开与特定数据库的连接。 它关闭了当前打开的数据库。

以下语句是Disconnect命令的基本语法。

DISCONNECT

注 - 只有在连接到特定数据库后才能使用此命令，并且只会关闭当前运行的数据库。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。 我们将从demo数据库断开连接。

可以使用以下命令断开数据库连接。

orientdb {db = demo}> DISCONNECT

如果它成功断开连接，将获得以下输出 -

orientdb {db=demo}>  DISCONNECT

Disconnecting from the database [demo]...OK
orientdb>

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB数据库信息 - OrientDB教程™

本章介绍如何从OrientDB命令行获取特定数据库的信息。

以下语句是Info命令的基本语法。

info

注 - 只有在连接到特定数据库后才能使用此命令，并且它将检索仅当前正在运行的数据库的信息。

示例

在这个例子中，我们将使用我们在前一章中创建的名为demo的数据库。 将从demo数据库中检索基本信息。

可以使用以下命令获取数据库信息。

orientdb {db = demo}> info

如果成功执行上面命令，将获得以下输出。

... ...
|9   |orole    |   4|ORole    |                 |    3|      910b|
|10  |oschedule|   8|OSchedule|                 |    0|        0b|
|11  |osequence|   7|OSequence|                 |    0|        0b|
|12  |ouser    |   5|OUser    |                 |    3|      617b|
|13  |v        |   9|V        |                 |    0|        0b|
|14  |v_1      |  10|V        |                 |    0|        0b|
|15  |v_2      |  11|V        |                 |    0|        0b|
|16  |v_3      |  12|V        |                 |    0|        0b|
+----+---------+----+---------+-----------------+-----+----------+
|    |TOTAL    |    |         |                 |    9|   11.94KB|
+----+---------+----+---------+-----------------+-----+----------+

CLASSES
+----+-----------+-------------+-----------------------------+-----+
|#   |NAME       |SUPER-CLASSES|CLUSTERS                     |COUNT|
+----+-----------+-------------+-----------------------------+-----+
|0   |E          |             |e(13),e_1(14),e_2(15),e_3(16)|    0|
|1   |OFunction  |             |ofunction(6)                 |    0|
|2   |OIdentity  |             |-                            |    0|
|3   |ORestricted|             |-                            |    0|
|4   |ORole      |[OIdentity]  |orole(4)                     |    3|
|5   |OSchedule  |             |oschedule(8)                 |    0|
|6   |OSequence  |             |osequence(7)                 |    0|
|7   |OTriggered |             |-                            |    0|
|8   |OUser      |[OIdentity]  |ouser(5)                     |    3|
|9   |V          |             |v(9),v_1(10),v_2(11),v_3(12) |    0|
+----+-----------+-------------+-----------------------------+-----+
|    |TOTAL      |             |                             |    6|
+----+-----------+-------------+-----------------------------+-----+

INDEXES
+----+--------------+-----------------+-------+---------+-------+------------+
|#   |NAME          |TYPE             |RECORDS|CLASS    |COLLATE|FIELDS      |
+----+--------------+-----------------+-------+---------+-------+------------+
|0   |dictionary    |DICTIONARY       |0      |         |default|            |
|1   |OFunction.name|UNIQUE_HASH_INDEX|0      |OFunction|default|name(STRING)|
|2   |ORole.name    |UNIQUE           |3      |ORole    |ci     |name(STRING)|
|3   |OUser.name    |UNIQUE           |3      |OUser    |ci     |name(STRING)|
+----+--------------+-----------------+-------+---------+-------+------------+
|    |TOTAL         |                 |6      |         |       |            |
+----+--------------+-----------------+-------+---------+-------+------------+
orientdb {db=demo}>

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB列出数据库 - OrientDB教程™

本章介绍如何从OrientDB命令行获取实例中所有数据库的列表。

以下语句是list命令的基本语法。

LIST DATABASES

注 - 只有在连接到本地或远程服务器后，才能使用此命令。

示例

在检索数据库列表之前，必须通过远程服务器连接到本地主机服务器。 需要提醒的是，连接到本地主机实例的用户名和密码分别是guest和guest，它是在orintdb/config/orientdb-server-config.xml文件中配置的。

可以使用以下命令连接到localhost数据库服务器实例。

orientdb> connect remote:localhost guest

它会询问密码。 根据guest的配置文件密码也是guest。 如果连接成功，将获得以下输出。

Connecting to remote Server instance [remote:localhost] with user 'guest'...OK
orientdb {server = remote:localhost/}>

连接到localhost数据库服务器后，可以使用以下命令列出数据库。

orientdb {server = remote:localhost/}> list databases

如果它成功执行，将获得以下输出 -

Found 6 databases:
* demo (plocal)
* s2 (plocal)
* s1 (plocal)
* GratefulDeadConcerts (plocal)
* s3 (plocal)
* sample (plocal)
orientdb {server = remote:localhost/}>

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB冻结数据库 - OrientDB教程™

无论何时可能需要将数据库状态设置为静态，意味着数据库未响应任何读取和写入操作的状态。 简单地说，数据库处于冻结状态。

在本章中，可以学习如何从OrientDB命令行冻结数据库。

以下语句是冻结数据库命令的基本语法。

FREEZE DATABASE

注 - 只有在连接到远程或本地数据库中的特定数据库后，才能使用此命令。

示例

在这个例子中，我们将使用我们在前一章中创建的名为demo的数据库。 我们将从CLI冻结这个数据库。

可以使用以下命令冻结数据库。

Orientdb {db = demo}> FREEZE DATABASE

如果它成功执行，将获得以下输出。

Database 'demo' was frozen successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB释放数据库 - OrientDB教程™

在本章中，您可以学习如何通过OrientDB命令行将数据库从冻结状态转为释放状态。

以下语句是Release数据库命令的基本语法。

RELEASE DATABASE

注 - 只有在连接到处于冻结状态的特定数据库后，才能使用此命令。

示例

在这个例子中，我们将使用我们在前一章中创建的名为demo的数据库。 我们将释放在前一章中冻结的数据库。

可以使用以下命令来释放数据库。

Orientdb {db = demo}> RELEASE DATABASE

如果它成功执行，将获得以下输出。

Database 'demo' was release successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB配置数据库 - OrientDB教程™

在本章中，学习如何通过OrientDB命令行显示特定数据库的配置。 该命令适用于本地和远程数据库。

配置信息包含启用或未启用的默认缓存，该缓存的大小，加载因子值，映射的最大内存，节点页面大小，池最小和最大大小等。

以下语句是config数据库命令的基本语法。

CONFIG

注 - 只有在连接到特定数据库后才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。

可以使用以下命令来显示演示数据库的配置。

Orientdb {db = demo}> CONFIG

如果它成功执行，您将得到以下输出。

LOCAL SERVER CONFIGURATION:
+---------------------------------------+-------------------------+
| NAME                                  | VALUE                   |
+---------------------------------------+-------------------------+
| environment.dumpCfgAtStartup          | false                   |
| environment.concurrent                | true                    |
| environment.allowJVMShutdown          | true                    |
| script.pool.maxSize                   | 20                      |
| memory.useUnsafe                      | true                    |
| memory.directMemory.safeMode          | true                    |
| memory.directMemory.trackMode         | false                   |
|………………………………..                         |                         |
| storage.lowestFreeListBound           | 16                      |
| network.binary.debug                  | false                   |
| network.http.maxLength                | 1000000                 |
| network.http.charset                  | utf-8                   |
| network.http.jsonResponseError        | true                    |
| network.http.json                     | false                   |
| tx.log.fileType                       | classic                 |
| tx.log.synch                          | false                   |
| tx.autoRetry                          | 1                       |
| client.channel.minPool                | 1                       |
| storage.keepOpen                      | true                    |
| cache.local.enabled                   | true                    |
+---------------------------------------+-------------------------+
orientdb {db = demo}>

在上面的配置参数列表中，如果要更改任何参数值，则可以使用config set和get命令轻松地从命令行执行此操作。

Config Set命令

可以使用CONFIG SET命令更新配置变量值。

以下语句是config set命令的基本语法。

CONFIG SET <config-variable> <config-value>

注 - 只有在连接到特定数据库后才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为'demo'的数据库。假设要修改'tx.autoRetry'变量值为5。

可以使用以下命令设置demo数据库的配置。

orientdb {db = demo}> CONFIG SET tx.autoRetry 5

如果它成功执行，将获得以下输出。

Local configuration value changed correctly

CONFIG GET命令

可以使用CONFIG GET命令显示配置变量值。

以下语句是config get命令的基本语法。

CONFIG GET <config-variable>

注 - 只有在连接到特定数据库后才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。假设要检索'tx.autoRetry'变量值。

可以使用以下命令来显示demo数据库的配置。

orientdb {db = demo}> CONFIG GET tx.autoRetry

如果它成功执行，将获得以下输出。

Local configuration: tx.autoRetry = 5

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB导出数据库 - OrientDB教程™

与RDBMS类似，OrientDB还提供了导出和导入数据库等功能。 OrientDB使用JSON格式导出数据。 默认情况下，export命令使用GZIP算法来压缩文件。

导出数据库时不会锁定数据库，这意味着您可以对其执行并发读取和写入操作。可以创建该数据的完全副本，因为并发的读取和写入操作。

在本章中，学习如何从OrientDB命令行导出数据库。

以下语句是Export database命令的基本语法。

EXPORT DATABASE <output file>

注 - 只有在连接到特定数据库后才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。可以使用以下命令将数据库导出到名为export-demo的文件。

orientdb {db = demo}> EXPORT DATABASE ./export-demo.export

如果它成功执行，它将根据操作系统创建一个名为'export-demo.zip'或'exportdemo.gz'的文件，将会看到以下输出。

Exporting current database to: DATABASE /home/linuxtp/Desktop/demo.export in
GZipped JSON format ...

Started export of database 'demo' to /home/linuxtp/Desktop/demo.export.gz...
Exporting database info...OK
Exporting clusters...OK (12 clusters)
Exporting schema...OK (11 classes)
Exporting records...
- Cluster 'internal' (id = 0)...OK (records = 3/3)
- Cluster 'index' (id = 1)...OK (records = 0/0)
- Cluster 'manindex' (id = 2)...OK (records = 0/0)
- Cluster 'default' (id = 3)...OK (records = 0/0)
- Cluster 'orole' (id = 4)...OK (records = 3/3)
- Cluster 'ouser' (id = 5)...OK (records = 3/3)
- Cluster 'ofunction' (id = 6)...OK (records = 0/0)
- Cluster 'oschedule' (id = 7)...OK (records = 0/0)
- Cluster 'orids' (id = 8)...OK (records = 0/0)
- Cluster 'v' (id = 9)...OK (records = 0/0)
- Cluster 'e' (id = 10)...OK (records = 0/0)
- Cluster '_studio' (id = 11)...OK (records = 1/1)

Done. Exported 10 of total 10 records

Exporting index info...
- Index dictionary...OK
- Index OUser.name...OK
- Index ORole.name...OK
OK (3 indexes)
Exporting manual indexes content...
- Exporting index dictionary ...OK (entries = 0)
OK (1 manual indexes)

Database export completed in 127ms

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB导入数据库 - OrientDB教程™

如果想要导入数据库，必须使用由export命令生成的JSON格式导出文件。

在本章中，学习如何从OrientDB命令行导入数据库。

以下语句是Import数据库命令的基本语法。

IMPORT DATABASE <input file>

注 - 只有在连接到特定数据库后才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。可以使用以下命令将数据库导入名为“export-demo.gz”的文件。

orientdb {db = demo}> IMPORT DATABASE ./export-demo.export.gz

如果成功执行，将会看到以下输出以及成功的通知。

Database import completed in 2101ms

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB提交数据库 - OrientDB教程™

与RDBMS相似，OrientDB也提供了Commit和Rollback等事务概念。 提交是指通过保存对数据库的所有更改来关闭事务。 回滚是指将数据库状态恢复到您打开事务的位置。

以下语句是Commit数据库命令的基本语法。

COMMIT;

注 - 只有在连接到特定数据库并开始事务后，才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。将看到提交事务的操作并使用事务来存储记录。

首先，使用以下BEGIN命令启动事务。

orientdb {db = demo}> BEGIN

然后，使用以下命令将值为id = 12和name = Maxsu的记录插入到 employee 表中。

orientdb> INSERT INTO employee (id, name) VALUES (12, 'Maxsu')

可以使用以下命令来提交事务。

orientdb> commit

如果此事务成功提交，将得到以下输出。

Transaction 2 has been committed in 4ms

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB回滚数据库 - OrientDB教程™

在本章中，将学习如何通过OrientDB命令行界面回滚未提交的事务。

以下语句是Rollback数据库命令的基本语法。

ROLLBACK

注 - 只有在连接到特定数据库并开始事务后，才能使用此命令。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。您将看到回滚事务的操作并使用事务来存储记录。

首先，使用以下BEGIN命令启动事务。

orientdb {db = demo}> BEGIN

然后，使用以下命令将值为id = 12和name = Maxsu的记录插入到employee表中。

orientdb> INSERT INTO employee (id, name) VALUES (12, 'Maxsu')

可以使用以下命令从Employee表中检索记录。

orientdb> SELECT FROM employee WHERE name LIKE '%su'

如果此命令成功执行，将获得以下输出。

---+-------+--------------------
 # | ID   | name
---+-------+--------------------
 0 | 12   | Maxsu
---+-------+--------------------
1 item(s) found. Query executed in 0.076 sec(s).

现在可以使用以下命令来回滚此事务。

orientdb> ROLLBACK

再次检查选择查询以从employee表中检索相同的记录。

orientdb> SELECT FROM employee WHERE name LIKE '%su'

如果回滚成功执行，将查找到0条记录。

0 item(s) found. Query executed in 0.037 sec(s).

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB优化数据库 - OrientDB教程™

根据技术术语，优化表示“在最快的时间内实现更好的性能”。 参照数据库，优化涉及最大化检索数据的速度和效率。

OrientDB支持轻量级边缘，这意味着数据实体之间的直接关系。 简而言之，它是一个字段到字段的关系。 OrientDB提供了不同的方法来优化数据库。 它支持将常规边转换为轻量级边缘。

以下语句是Optimize数据库命令的基本语法。

OPTMIZE DATABASE [-lwedges] [-noverbose]

lwedges将常规边转换为轻量级边，而noverbose禁用输出。

示例

在这个例子中，我们将使用在前一章中创建的名为demo的数据库。可以使用以下optimize数据库命令。

OPTIMIZE DATABASE -lwedges

如果它成功执行，将获得一些成功的通知以及完成消息。

Database Optimization completed in 32ms

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除数据库 - OrientDB教程™

与RDBMS类似，OrientDB提供了删除数据库的功能。 删除数据库是指完全删除数据库。

以下语句是Drop数据库命令的基本语法。

DROP DATABASE [<database-name> <server-username> <server-user-password>]

以下是有关上述语法中选项的详细信息。

<database-name> - 要删除的数据库名称。

<server-username> - 有权删除数据库的数据库的用户名。

<server-user-password> - 特定用户的密码。

示例

有两种方法可以删除数据库，第一种方法是:删除当前打开的数据库，另一种是:通过提供特定的名称来删除特定的数据库。

在这个例子中，我们将使用在前面章节中创建的名为demo的数据库。可以使用以下命令删除demo数据库。

orientdb {db = demo}> DROP DATABASE

如果此命令成功执行，您将看到以下输出。

Database 'demo' deleted successfully

或者

可以使用其他命令删除数据库，如下所示。

orientdb> DROP DATABASE PLOCAL:/opt/orientdb/databases/demo admin admin

如果此命令成功执行，您将看到以下输出。

Database 'demo' deleted successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB记录命令

OrientDB插入记录 - OrientDB教程™

OrientDB是一个NoSQL数据库，可以存储文档和面向图形的数据。 NoSQL数据库不包含任何表，那么要如何将数据作为记录插入？在这里，您可以以类，属性，顶点和边的形式查看表数据，类表就像表，属性就像表中的文件。

可以在OrientDB中使用模式定义所有这些实体。 属性数据可以被插入到一个类中。 插入命令在数据库模式中创建一条新记录。 记录可以无模式或遵循一些指定的规则。

以下语句是“插入记录”命令的基本语法。

INSERT INTO [class:]<class>|cluster:<cluster>|index:<index>
   [(<field>[,]*) VALUES (<expression>[,]*)[,]*]|
   [SET <field> = <expression>|<sub-command>[,]*]|
   [CONTENT {<JSON>}]
   [RETURN <expression>]
   [FROM <query>]

以下是有关上述语法中选项的详细信息。

SET - 定义每个字段和值。

CONTENT - 定义JSON数据以设置字段值。 这是可选的。

RETURN - 定义要返回的表达式而不是插入的记录数。 最常见的用例是 -

@rid - 返回新记录的记录ID。

@this - 返回整个新记录。

FROM - 想要插入记录或结果集的位置。

示例

假设有一个包含以下字段和类型的Customer表。

编号 | 字段名称 | 描述
1 | ID | Integer
2 | Name | String
3 | Age | Integer

可以通过执行以下命令来创建Schema(表)。

CREATE DATABASE PLOCAL:/opt/orientdb/databases/sales
CREATE CLASS Customer
CREATE PROPERTY Customer.id integer
CREATE PROPERTY Customer.name String
CREATE PROPERTY Customer.age integer

执行完所有命令后，将得到具有id，name和age字段的一个Customer表。 可以通过在Customer表中执行select查询来检查表中的数据。

OrientDB提供了插入记录的不同方法。 考虑下面的包含示例记录的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

以下命令将第一条记录插入到Customer表中。

INSERT INTO Customer (id, name, age) VALUES (01,'satish', 25)

如果上述命令成功执行，您将得到以下输出。

Inserted record 'Customer#11:0{id:1,name:satish,age:25} v1' in 0.069000 sec(s).

以下命令将第二条记录插入到Customer表中。

INSERT INTO Customer SET id = 02, name = 'krishna', age = 26

如果上述命令成功执行，您将得到以下输出。

Inserted record 'Customer#11:1{id:2,age:26,name:krishna} v1' in 0.005000 sec(s).

以下命令将第三条记录插入Customer表中。

INSERT INTO Customer CONTENT {"id": "03", "name": "kiran", "age": "29"}

如果上述命令成功执行，您将得到以下输出。

Inserted record 'Customer#11:2{id:3,name:kiran,age:29} v1' in 0.004000 sec(s).

以下命令将插入到Customer表中的下两条记录。

INSERT INTO Customer (id, name, age) VALUES (04,'javeed', 21), (05,'raja', 29)

如果上述命令成功执行，您将得到以下输出。

Inserted record '[Customer#11:3{id:4,name:javeed,age:21} v1,
Customer#11:4{id:5,name:raja,age:29} v1]' in 0.007000 sec(s).

可以通过执行以下命令来检查是否插入了所有这些记录。

SELECT * FROM Customer

如果上述命令成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
2   |#11:2|Customer|3   |kiran  |29
3   |#11:3|Customer|4   |javeed |21
4   |#11:4|Customer|5   |raja   |29
----+-----+--------+----+-------+----

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB查询记录 - OrientDB教程™

与RDBMS类似，OrientDB支持不同类型的SQL查询以从数据库检索记录。 在检索记录时，我们有不同的变体或查询选项以及select语句。

以下语句是SELECT命令的基本语法。

SELECT [ <Projections> ] [ FROM <Target> [ LET <Assignment>* ] ]
   [ WHERE <Condition>* ]
   [ GROUP BY <Field>* ]
   [ ORDER BY <Fields>* [ ASC|DESC ] * ]
   [ UNWIND <Field>* ]
   [ SKIP <SkipRecords> ]
   [ LIMIT <MaxRecords> ]
   [ FETCHPLAN <FetchPlan> ]
   [ TIMEOUT <Timeout> [ <STRATEGY> ] ]
   [ LOCK default|record ]
   [ PARALLEL ]
   [ NOCACHE ]

以下是有关上述语法中选项的详细信息。

<Projections> - 表示想从查询中提取的数据作为结果记录集。

FROM - 表示要查询的对象。 这可以是一个类，群集，单个记录标识，一组记录标识。可以将所有这些对象指定为目标。

WHERE - 指定过滤结果集的条件。

LET - 表示在投影，条件或子查询中使用的上下文变量。

GROUP BY - 表示分组记录的字段。

ORDER BY - 表示按顺序排列记录的字段。

UNWIND - 指定展开记录集合的字段。

SKIP - 定义要从结果集开始跳过的记录数。

LIMIT - 表示结果集中记录的最大数量。

FETCHPLAN - 指定定义如何获取结果的策略。

TIMEOUT - 定义查询的最大时间(以毫秒为单位)。

LOCK - 定义锁定策略。 DEFAULT和RECORD是可用的锁定策略。

PARALLEL - 对'x'并发线程执行查询。

NOCACHE - 定义是否要使用缓存。

示例

让我们考虑在前一章中创建的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试使用不同的select查询来从Customer表中检索数据记录。

方法1 - 可以使用以下查询从Customer表中选择所有记录。

orientdb {db = demo}> SELECT FROM Customer

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
2   |#11:2|Customer|3   |kiran  |29
3   |#11:3|Customer|4   |javeed |21
4   |#11:4|Customer|5   |raja   |29
----+-----+--------+----+-------+----

方法2 - 选择名字以字母k开头的所有记录。

orientdb {db = demo}> SELECT FROM Customer WHERE name LIKE 'k%'

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:1|Customer|2   |krishna|26
1   |#11:2|Customer|3   |kiran  |29
----+-----+--------+----+-------+----

方法3 - 从Customer表中选择id，name的记录，name以大写字母形式返回。

orientdb {db = demo}> SELECT id, name.toUpperCase() FROM Customer

如果上述查询成功执行，您将得到以下输出。

----+--------+----+-------
#   |@CLASS  |id  |name
----+--------+----+-------
0   |null    |1   |SATISH
1   |null    |2   |KRISHNA
2   |null    |3   |KIRAN
3   |null    |4   |JAVEED
4   |null    |5   |RAJA
----+--------+----+-------

方法4 - 选择年龄在25到29范围内的Customer表中的所有记录。

orientdb {db = demo}> SELECT FROM Customer WHERE age in [25,29]

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:2|Customer|3   |kiran  |29
2   |#11:4|Customer|5   |raja   |29
----+-----+--------+----+-------+----

方法5 - 从Customer表中选择任何字段包含单词sh的所有记录。

orientdb {db = demo}> SELECT FROM Customer WHERE ANY() LIKE '%sh%'

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
----+-----+--------+----+-------+----

方法6 - 从Customer表中选择所有记录，按年龄按降序排列。

orientdb {db = demo}> SELECT FROM Customer ORDER BY age DESC

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:2|Customer|3   |kiran  |29
1   |#11:4|Customer|5   |raja   |29
2   |#11:1|Customer|2   |krishna|26
3   |#11:0|Customer|1   |satish |25
4   |#11:3|Customer|4   |javeed |21
----+-----+--------+----+-------+----

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB加载记录 - OrientDB教程™

加载记录用于从模式加载特定的记录。 加载记录将在记录ID的帮助下加载记录。 它在结果集中用@rid符号表示。

以下语句是LOAD Record命令的基本语法。

LOAD RECORD <record-id>

其中<record-id>定义要加载的记录的记录标识。

如果不知道特定记录的记录标识，则可以对该表执行任何查询。 在结果集中，可以找到相应记录的记录ID(@rid)。

示例

让我们考虑一下前面章节中使用的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询来检索具有记录ID @rid:＃11:0 的记录。

orientdb {db = demo}> LOAD RECORD #11:0

如果上述查询成功执行，您将得到以下输出。

+---------------------------------------------------------------------------+
| Document - @class: Customer        @rid: #11:0           @version: 1      |
+---------------------------------------------------------------------------+
|                     Name | Value                                          |
+---------------------------------------------------------------------------+
|                       id | 1                                              |
|                     name | satish                                         |
|                      age | 25                                             |
+---------------------------------------------------------------------------+

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB重新加载记录 - OrientDB教程™

重新加载记录的作用类似于加载记录命令，也用于从模式加载特定记录。 加载记录将在记录ID的帮助下加载记录。 它在结果集中用@rid符号表示。 主要区别在于重新加载记录会忽略在应用外部并发事务更改记录时有用的缓存。 它会给最新的更新。

以下语句是RELOAD Record命令的基本语法。

RELOAD RECORD <record-id>

其中<record-id>定义要重新加载的记录的记录ID。

如果您不知道特定记录的记录标识，则可以对该表执行任何查询。 在结果集中，可以找到相应记录的记录ID(@rid)。

示例

让我们考虑一下在前一章中使用的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询来检索具有记录ID @rid:＃11:0的记录

orientdb {db = demo}> LOAD RECORD #11:0

如果上述查询成功执行，您将得到以下输出。

+---------------------------------------------------------------------------+
| Document - @class: Customer        @rid: #11:0           @version: 1      |
+---------------------------------------------------------------------------+
|                     Name | Value                                          |
+---------------------------------------------------------------------------+
|                       id | 1                                              |
|                     name | satish                                         |
|                      age | 25                                             |
+---------------------------------------------------------------------------+

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB导出记录 - OrientDB教程™

导出记录是用于将加载的记录导出为请求和支持的格式的命令。 如果执行任何错误的语法，它会给出支持的格式列表。 OrientDB是一个文档数据库系列，因此JSON是默认支持的格式。

以下语句是EXPORT RECORD命令的基本语法。

EXPORT RECORD <format>

其中<format>定义了想要获取记录的格式。

注 - 导出命令将根据记录标识导出已加载的记录。

示例

让我们考虑一下在前一章中使用的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询来检索具有记录ID @rid:＃11:0的记录

orientdb {db = demo}> LOAD RECORD #11:0

如果上述查询成功执行，您将得到以下输出。

+---------------------------------------------------------------------------+
| Document - @class: Customer        @rid: #11:0           @version: 1      |
+---------------------------------------------------------------------------+
|                     Name | Value                                          |
+---------------------------------------------------------------------------+
|                       id | 1                                              |
|                     name | satish                                         |
|                      age | 25                                             |
+---------------------------------------------------------------------------+

使用以下查询将他加载的记录(#11:0)导出为JSON格式。

orientdb {db = demo}> EXPORT RECORD json

如果上述查询成功执行，您将得到以下输出。

{
   "@type": "d",
      "@rid": "#11:0",
   "@version": 1,
   "@class": "Customer",
      "id": 1,
      "name": "satish",
      "age": 25
}

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB更新记录 - OrientDB教程™

更新记录命令用于修改特定记录的值。 SET是更新特定字段值的基本命令。

以下语句是Update命令的基本语法。

UPDATE <class>|cluster:<cluster>|<recordID>
   [SET|INCREMENT|ADD|REMOVE|PUT <field-name> = <field-value>[,]*] |[CONTENT| MERGE <JSON>]
   [UPSERT]
   [RETURN <returning> [<returning-expression>]]
   [WHERE <conditions>]
   [LOCK default|record]
   [LIMIT <max-records>] [TIMEOUT <timeout>]

以下是有关上述语法中选项的详细信息。

SET - 定义要更新的字段。

INCREMENT - 将指定的字段值增加给定的值。

ADD - 在收集字段中添加新项目。

REMOVE - 从收集字段中移除一个项目。

PUT - 在地图字段中输入条目。

CONTENT - 用JSON文档内容替换记录内容。

MERGE - 将记录内容与JSON文档合并。

LOCK - 指定如何锁定加载和更新之间的记录。有两个选项来指定默认和记录。

UPSERT - 如果存在记录，则更新记录;如果不存在，则插入新记录。 它有助于在执行两个查询的地方执行单个查询。

RETURN - 指定要返回的表达式而不是记录数。

LIMIT - 定义要更新的最大记录数。

TIMEOUT - 定义在超时之前允许更新运行的时间。

示例

让我们考虑一下在前一章中使用的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询来更新客户Raja的年龄。

Orientdb {db = demo}> UPDATE Customer SET age = 28 WHERE name = 'Raja'

如果上述查询成功执行，您将得到以下输出。

Updated 1 record(s) in 0.008000 sec(s).

要检查Customer表的记录，可以使用以下查询。

orientdb {db = demo}> SELECT FROM Customer

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
2   |#11:2|Customer|3   |kiran  |29
3   |#11:3|Customer|4   |javeed |21
4   |#11:4|Customer|5   |raja   |28
----+-----+--------+----+-------+----

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB截断记录 - OrientDB教程™

截断记录命令用于删除特定记录的值。
以下语句是截断命令的基本语法。

TRUNCATE RECORD <rid>*

其中<rid> *表示要截断的记录标识。 可以使用多个以逗号分隔的Rid截断多个记录。 它返回截断记录的数量。

示例

让我们考虑在前一章中创建的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询以截断具有记录ID＃11:4的记录。

Orientdb {db = demo}> TRUNCATE RECORD #11:4

如果上述查询成功执行，您将得到以下输出。

Truncated 1 record(s) in 0.008000 sec(s).

要查询Customer表的记录，可以使用以下查询。

Orientdb {db = demo}> SELECT FROM Customer

如果上述查询成功执行，将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
2   |#11:2|Customer|3   |kiran  |29
3   |#11:3|Customer|4   |javeed |21
----+-----+--------+----+-------+----

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除记录 - OrientDB教程™

删除记录命令用于从数据库中完全删除一个或多个记录。

以下语句是Delete命令的基本语法。

DELETE FROM <Class>|cluster:<cluster>|index:<index>
   [LOCK <default|record>]
   [RETURN <returning>]
   [WHERE <Condition>*]
   [LIMIT <MaxRecords>]
   [TIMEOUT <timeout>]

以下是有关上述语法中选项的详细信息。

LOCK - 指定如何锁定加载和更新之间的记录。有两个选项来指定默认和记录。

RETURN - 指定要返回的表达式而不是记录数。

LIMIT - 定义要更新的最大记录数。

TIMEOUT - 定义在超时之前允许更新运行的时间。

注 - 请勿使用DELETE删除“顶点”或“边”，因为它会影响图的完整性。

示例

让我们考虑在前一章中创建的Customer表。

编号 | 名字 | 年龄
1 | Satish | 25
2 | Krishna | 26
3 | Kiran | 29
4 | Javeed | 21
5 | Raja | 29

尝试以下查询以删除id = 4的记录。

orientdb {db = demo}> DELETE FROM Customer WHERE id = 4

如果上述查询成功执行，您将得到以下输出。

Delete 1 record(s) in 0.008000 sec(s).

要查询Customer表的记录，可以使用以下查询。

Orientdb {db = demo}> SELECT FROM Customer

如果上述查询成功执行，您将得到以下输出。

----+-----+--------+----+-------+----
#   |@RID |@CLASS  |id  |name   |age
----+-----+--------+----+-------+----
0   |#11:0|Customer|1   |satish |25
1   |#11:1|Customer|2   |krishna|26
2   |#11:2|Customer|3   |kiran  |29
----+-----+--------+----+-------+----

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB类命令

OrientDB创建类 - OrientDB教程™

OrientDB支持多模型功能，并提供了不同的方法来处理和理解数据库的基本概念。可以从文档数据库API的角度轻松访问这些模型。与RDBMS一样，OrientDB也使用Record作为存储元素，但它使用Document类型。文档以键/值对的形式存储。我们将字段和属性存储为属于概念类的键/值对。

类是一种数据模型，其概念是从面向对象的编程范例中提取的。基于传统的文档数据库模型，数据以集合的形式存储，而关系数据库模型中的数据存储在表中。 OrientDB遵循Document API和OPPS范例。作为一个概念，OrientDB中的类与关系数据库中的表格有着最密切的关系，但是(与表不同)类可以是无模式，全模式或混合模式。类可以从其他类继承，创建类的树。每个类都有自己的一个或多个集群(如果没有定义，则默认创建)。

以下语句是创建类命令的基本语法。

CREATE CLASS <class>
[EXTENDS <super-class>]
[CLUSTER <cluster-id>*]
[CLUSTERS <total-cluster-number>]
[ABSTRACT]

以下是有关上述语法中选项的详细信息。

<class> - 定义要创建的类的名称。

<super-class> - 定义想用这个类扩展的超级类。

<total-cluster-number> - 定义此类中使用的簇的总数。 缺省值是1。

ABSTARCT - 定义类是抽象的。 这是可选的。

示例

如前所述，类是与表相关的概念。 因此，我们将在这里创建一个表:Account。 但是，在创建类时，无法定义字段，即基于OOPS范例的属性。

以下命令是创建一个名为Account的类。

orientdb> CREATE CLASS Account

如果上述命令执行成功，将得到以下输出。

Class created successfully

可以使用以下命令创建一个扩展Vehicle类的Car类。

orientdb> CREATE CLASS Car EXTENDS Vehicle

如果上述命令执行成功，您将得到以下输出。

Class created successfully

可以使用以下命令将Person创建为抽象类型。

orientdb> CREATE CLASS Person ABSTRACT

如果上述命令执行成功，您将得到以下输出。

Class created successfully

注 - 如果没有属性，这个类就没用，也无法构建真实的对象。 在下面的章节中，您可以学习如何为特定的类创建属性。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB修改类 - OrientDB教程™

OrientDB中的类和属性用于构建具有各自属性的模式，例如类名称，超类，簇，簇数，摘要等。如果要修改或更新模式中现有类的任何属性，必须使用Alter Class命令。

以下语句是Alter类命令的基本语法。

ALTER CLASS <class> <attribute-name> <attribute-value>

以下是有关上述语法中选项的详细信息。

<class> - 定义类名称。

<attribute-name> - 定义想要更改的属性。

<attribute-value> - 定义要为属性设置的值。

下表定义了支持Alter Class命令的属性列表。

属性 | 类型 | 描述
NAME | 字符串 | 更改类名称。
SHORTNAME | 字符串 | 为类定义一个简短名称(即别名)。 使用NULL删除短名称分配。
SUPERCLASS | 字符串 | 为类定义一个超类。 要添加一个新类，可以使用语法:+ <class>添加，将其删除则使用语法:- <class>。
OVERSIZE | 十进制数字 | 定义超大系数。
ADDCLUSTER | 字符串 | 向该类添加一个集群。如果群集不存在，它将创建一个物理群集。 将簇添加到类中也可用于在分布式服务器中存储记录。
REMOVECLUSTER | 字符串 | 从类中删除一个集群。 它不会删除集群，只会将其从类中删除。
STRICTMODE | — | 启用或禁用严格模式。 当处于严格模式时，将以模式完整模式工作，并且如果它们是类的模式定义的一部分，则不能将新属性添加到记录中。
CLUSTERSELECTION | — | 定义选择哪个群集用于新记录的选择策略。
CUSTOM | — | 定义自定义属性。属性名称和值必须遵循名称和值之间没有空格的语法<propertyname>=<value>。
ABSTRACT | 布尔值 | 将类转换为抽象类或相反。

示例

让我们尝试一些将更新或修改现有类的属性的示例。

以下查询用于为现有类:Employee重新指定它的超类:Person。

orientdb> ALTER CLASS Employee SUPERCLASS Person

如果上述查询成功执行，您将得到以下输出。

Class altered successfully

以下查询用于为现有类Employee添加超类Person。

orientdb> ALTER CLASS Employee SUPERCLASS +Person

如果上述查询成功执行，您将得到以下输出。

Class altered successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB截断类 - OrientDB教程™

截断类将删除定义为类的一部分的所有簇的记录。 在OrientDB中，每个类都有一个具有相同名称的关联群集。 如果还想从类层次结构中删除所有记录，则需要使用POLYMORPHIC关键字。

以下语句是Truncate Class命令的基本语法。

TRUNCATE CLASS <class> [ POLYMORPHIC ] [ UNSAFE ]

以下是有关上述语法中选项的详细信息。

<class> - 定义要截断的类。

POLYMORPHIC - 定义命令是否也截断层次结构。

UNSAFE - 定义命令在顶点或边界类上强制截断。

示例

以下查询截断类Profile。

orientdb> TRUNCATE CLASS Profile

如果上述查询成功执行，您将得到以下输出。

Class truncated successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除类 - OrientDB教程™

删除类命令从模式中删除一个类。 注意并保持一致的模式非常重要。 例如，避免删除其他超类的类。 关联的群集不会被删除。

以下语句是Drop class命令的基本语法。

DROP CLASS <class>

用类名删除一个类。

示例

尝试以下查询以删除类Employee。

Orientdb> DROP CLASS Employee

如果上述查询成功执行，您将得到以下输出。

Class dropped successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB集群命令

OrientDB创建集群 - OrientDB教程™

OrientDB中的集群是一个重要的概念，用于存储记录，文档或顶点。 简而言之，群集是存储一组记录的地方。 默认情况下，OrientDB将为每个类创建一个群集。 一个类的所有记录都存储在同一个簇中，它与该类名称相同。最多可以在数据库中创建32,767(2 ^ 15-1)个群集。

CREATE CLUSTER是用于创建具有特定名称的集群的命令。 创建群集后，可以使用群集通过在创建任何数据模型期间指定名称来保存记录。 如果要将新群集添加到类中，请使用Alter Class命令和ADDCLUSTER命令。

以下语句是创建群集命令的基本语法。

CREATE CLUSTER <cluster> [ID <cluster-id>]

其中<cluster>是定义要创建的群集的名称，<cluster-id>定义要用于群集的数字ID。

下表提供了群集选择策略的列表。

编号 | 策略 | 说明
1 | Default | 使用类属性默认的ClusterId选择集群。
2 | Round-robin | 按循环顺序选择下一个群集。 它一旦完成就重新启动。
3 | Balanced

选择最小的群集。 允许该类使所有基础集群在大小上保持均衡。 将新群集添加到现有类时，首先填充新群集。

示例

让我们举一个例子来创建一个名为sales的集群。

orientdb> CREATE CLUSTER sales

如果上述查询成功执行，您将得到以下输出。

Cluster created correctly with id #12

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB修改集群 - OrientDB教程™

更改集群(Alter Cluster命令)是更新现有集群上的属性。 在本章中，将学习如何添加或修改集群的属性。

以下语句是Alter Cluster命令的基本语法。

ALTER CLUSTER <cluster> <attribute-name> <attribute-value>

以下是有关上述语法中选项的详细信息。

<cluster> - 定义集群名称。

<attribute-name> - 定义您想要更改的属性。

<attribute-value> - 定义您要为此属性设置的值。

以下表中提供了可与Alter cluster命令一起使用的属性列表。

名称 | 类型 | 描述
NAME | 字符串 | 更改群集名称。
STATUS | 字符串 | 更改群集状态。允许的值是ONLINE和OFFLINE。 默认情况下，群集在线。
COMPRESSION | 字符串 | 定义要使用的压缩类型。 允许的值是NOTHING，SNAPPY，GZIP和OCompressionFactory类中注册的任何其他压缩类型。
USE_WAL | 布尔 | 定义OrientDB在对群集进行操作时是否使用日记帐
RECORD_GROW_FACTOR | 整数 | 定义增长因子以节省更多记录创建空间。 当使用附加信息更新记录时，您会发现这很有用。
RECORD_OVERFLOW_GROW_FACTOR | 整数 | 定义更新的增长因素。 达到大小限制时，使用此设置获得更多空间(因子 > 1)。
CONFLICTSTRATEGY | 字符串 | 定义在OrientDB MVCC找到对旧记录执行的更新或删除操作的情况下用于处理冲突的策略。

下表提供了冲突策略列表。

编号 | 策略 | 描述
1 | Version | 版本不同时引发异常。 这是默认设置。
2 | Content | 如果版本不同，它会检查内容的变化，否则会使用最高版本来避免引发异常。
3 | Automerge | 合并更改

示例

尝试以下示例查询来学习更改群集命令。

执行以下命令将集群名称从Employee更改为Employee2。

orientdb {db = demo}> ALTER CLUSTER Employee NAME Employee2

如果上述命令执行成功，将得到以下输出。

Cluster updated successfully

执行以下命令，使用群集ID将群集的名称从Employee2更改为Employee。

orientdb {db = demo}> ALTER CLUSTER 12 NAME Employee

如果上述命令执行成功，将得到以下输出。

Cluster updated successfully

执行以下命令将群集冲突策略更改为automerge。

orientdb {db = demo}> ALTER CLUSTER V CONFICTSTRATEGY automerge

如果上述命令执行成功，您将得到以下输出。

Cluster updated successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB截断集群 - OrientDB教程™

截断群集(Truncate Cluster命令)删除群集的所有记录。

以下语句是Truncate Cluster命令的基本语法。

TRUNCATE CLUSTER <cluster-name>

其中<cluster-name>是集群的名称。

示例

尝试以下查询以截断名为sales的集群。

Orientdb {db = demo}> TRUNCATE CLUSTER Profile

如果上述查询成功执行，您将得到以下输出。

Cluster truncated successfully.

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除集群 - OrientDB教程™

Drop Cluster命令用于删除集群及其所有相关内容。 这个操作是永久的并且回滚。

以下语句是Drop Cluster命令的基本语法。

DROP CLUSTER <cluster-name>|<cluster-id>

其中<cluster-name>定义要移除的群集的名称，<cluster-id>定义要移除的群集的ID。

示例

尝试使用以下命令删除Sales群集。

orientdb> DROP CLUSTER Sales

如果上述查询成功执行，您将得到以下输出。

Cluster dropped successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB属性命令

OrientDB创建属性 - OrientDB教程™

OrientDB中的属性就像数据库表中的类和列的字段。 创建属性是用于为特定类创建属性的命令。 在命令中使用的类名必须存在。

以下语句是创建属性命令的基本语法。

CREATE PROPERTY <class-name>.<property-name> <property-type> [<linked-type>][ <linked-class>]

以下是有关上述语法中选项的详细信息。

<class-name> - 定义要在其中创建属性的类。

<property-name> - 定义属性的逻辑名称。

<property-type> - 定义您想要创建的属性的类型。

<linked-type> - 定义容器属性类型中使用的容器类型。

<linked-class> - 定义容器属性类型中使用的容器类。

下表提供了属性的数据类型，以便OrientDB知道要存储的数据的类型。

BOOLEAN | INTEGER | SHORT | LONG
FLOAT | DATE | STRING | EMBEDDED
LINK | BYTE | BINARY | DOUBLE

除这些之外，还有其他几种作为容器的属性类型。

EMBEDDEDLIST | EMBEDDEDSET | EMBEDDEDMAP
LINKLIST | LINKSET | LINKMAP

示例

尝试下面的示例，在String类型的Employee类上创建一个属性名称。

orientdb> CREATE PROPERTY Employee.name STRING

如果上述查询成功执行，您将得到以下输出。

Property created successfully with id = 1

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB修改属性 - OrientDB教程™

修改属性(Alter Property命令)是用于修改或更新特定类的属性的命令。修改属性意味着修改表格的字段。 在本章中，将学习如何更新属性。

以下语句是Alter Property命令的基本语法。

以下是有关上述语法中选项的详细信息。

<class> - 定义属性所属的类。

<property> - 定义您想要更新的属性。

<attribute-name> - 定义要更新的属性的属性。

<attribute-value> - 定义您想要在属性上设置的值。

下表定义了用于更改属性的属性列表。

属性 | 类型 | 描述
LINKEDCLASS | 字符串 | 定义链接的类名称。 使用NULL删除现有的值。
LINKEDTYPE | 字符串 | 定义链接类型。 使用NULL删除现有的值。
MIN | 整型 | 将最小值定义为约束条件。 使用NULL删除现有的约束。
MANDATORY | 布尔 | 定义属性是否需要值。
MAX | 整型 | 将最大值定义为约束条件。 使用NULL删除现有的约束。
NAME | 字符串 | 定义属性名称。
NOTNULL | 布尔 | 定义属性是否可以具有NULL值。
REGEX | 字符串 | 将正则表达式定义为约束。 使用NULL删除现有的约束。
TYPE | 字符串 | 定义一个属性类型。
COLLATE | 字符串 | 将collate设置为定义的比较策略之一。 默认情况下，它被设置为区分大小写(cs)。 也可以将其设置为不区分大小写(ci)。
READONLY | 布尔 | 定义属性值是否不可变。 也就是说，如果可以在第一次分配后更改它。 与DEFAULT一起使用以创建不可变的值。

注意 - 如果您要更改NAME或TYPE，则此命令需要一些时间才能更新，具体取决于数据量。

示例

尝试下面给出的一些查询来理解修改属性。

执行以下查询以将该属性的名称从age更改为Customer类中的born。

orinetdb {db = demo}> ALTER PROPERTY Customer.age NAME born

如果上述查询成功执行，您将得到以下输出。

Property altered successfully

执行以下查询以将name设置为Customer类的强制属性(必填项)。

orientdb {db = demo}> ALTER PROPERTY Customer.name MANDATORY TRUE

如果上述查询成功执行，您将得到以下输出。

Property altered successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除属性 - OrientDB教程™

删除属性(Drop property命令)从模式中删除属性。 它不会从记录中删除属性值，它只是改变模式。

以下语句是Drop property命令的基本语法。

DROP PROPERTY <class>.<property> [FORCE]

以下是有关上述语法中选项的详细信息。

<class> - 定义属性所在的类。

<property> - 指定想要移除的属性。

[Force] - 如果在属性上定义了一个或多个索引。

示例

尝试使用以下命令从类Customer中删除age属性。

orientdb> DROP PROPERTY Customer.age

如果上述命令执行成功，您将得到以下输出。

Property dropped successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB顶点命令

OrientDB创建顶点 - OrientDB教程™

OrientDB数据库不仅是一个文档数据库，也是一个图形数据库。 Vertex和Edge等新概念用于以图形的形式存储数据。 它在顶点上应用多态性。 Vertex的基类是V.

在本章中，您将学习如何创建顶点来存储图形数据。

以下语句是创建顶点(Create Vertex)命令的基本语法。

CREATE VERTEX [<class>] [CLUSTER <cluster>] [SET <field> = <expression>[,]*]

以下是有关上述语法中选项的详细信息。

<class> - 定义顶点所属的类。

<cluster> - 定义存储顶点的集群。

<field> - 定义要设置的字段。

<expression> - 定义为字段设置的表达式。

示例

尝试下面的示例来了解如何创建顶点。

执行以下语句以在基类V上创建不含名称的顶点。

orientdb> CREATE VERTEX

如果上述查询成功执行，将得到以下输出。

Created vertex 'V#9:0 v1' in 0.118000 sec(s)

执行以下查询以创建一个名为v1的新顶点类，然后在该类中创建顶点。

orientdb> CREATE CLASS V1 EXTENDS V
orientdb> CREATE VERTEX V1

如果上述查询成功执行，您将得到以下输出。

Created vertex 'V1#14:0 v1' in 0.004000 sec(s)

执行以下查询来创建名为v1的类的新顶点，定义其属性，如brand ='Maruti'和name ='Swift'。

orientdb> CREATE VERTEX V1 SET brand = 'maruti', name = 'swift'

如果上述查询成功执行，您将得到以下输出。

Created vertex 'V1#14:1{brand:maruti,name:swift} v1' in 0.004000 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB移动顶点 - OrientDB教程™

在OrientDB中移动顶点命令是将一个或多个顶点从当前位置移动到不同的类或群集。 如果您在特定顶点上应用移动命令，则会更新连接到此顶点的所有边。 如果指定一个集群来移动顶点，那么它会将顶点移动到目标集群的服务器所有者。

以下语句是移动顶点(Move Vertex)命令的基本语法。

MOVE VERTEX <source> TO <destination>
[SET [<field>=<value>]* [,]]
[MERGE <JSON>]
[BATCH <batch-size>]

以下是有关上述语法中选项的详细信息。

<source> - 定义想要移动的顶点。 它接受顶点的特定顶点或记录ID数组的记录ID。

<destination> - 定义想要移动顶点的位置。 它支持类或集群作为目的地。

SET - 将值设置为字段。

MERGE - 通过JSON将值设置为字段。

BATCH - 定义批量大小。

注 - 该命令更新所有连接的边缘，但不更新链接。 使用Graph API时，建议使用连接到顶点的边。

示例

尝试以下示例以了解如何移动顶点。

执行以下查询将具有记录ID＃11:2的单个顶点从其当前位置移至类:Employee。

orientdb> MOVE VERTEX #11:2 TO CLASS:Employee

如果上述查询成功执行，您将得到以下输出 -

Move vertex command executed with result '[{old:#11:2, new:#13:0}]' in 0.022000 sec(s)

执行以下查询将一组顶点从Customer类移动到Employee类。

orientdb> MOVE VERTEX (SELECT FROM Customer) TO CLASS:Employee

如果上述查询成功执行，您将得到以下输出。

Move vertex command executed with result '[{old:#11:0,
new:#13:1},{old:#11:1, new:#13:2},{old:#11:2, new:#13:3}]' in 0.011000 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除顶点 - OrientDB教程™

删除顶点命令用于从数据库中删除顶点。 在删除时，它会检查并保持与边缘的一致性，并将所有交叉引用(带边)移除到已删除的顶点。

以下语句是删除顶点(Delete Vertex)命令的基本语法。

DELETE VERTEX <vertex> [WHERE <conditions>]
[LIMIT <MaxRecords>>] [BATCH <batch-size>]

以下是有关上述语法中选项的详细信息。

<VERTEX> - 使用其类，记录标识或子查询定义要移除的顶点。

WHERE - 过滤条件以确定命令删除哪些记录。

LIMIT - 定义要删除的最大记录数。
— BATCH - 定义命令一次删除多少个记录，允许您将大型事务分解为更小的块以节省内存使用量。

示例
尝试以下命令以了解如何删除单个顶点或多个顶点。

执行以下命令删除顶点#14:1。

orientdb> DELETE VERTEX #14:1

如果上述命令执行成功，您将得到以下输出。

Delete record(s) '1' in 0.005000 sec(s)

执行以下命令以从isSpam属性标记的类Customer中删除所有顶点。

orientdb> DELETE VERTEX Customer WHERE isSpam = TRUE

如果上述命令执行成功，您将得到以下输出。

Delete record(s) '3' in 0.005000 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB边缘命令

OrientDB创建边 - OrientDB教程™

在OrientDB中，Edge的概念就像顶点之间的关系一样在某些属性的帮助下工作。 边和顶点是图数据库的主要组成部分。 它在边缘上应用多态性。 Edge的基类是E。在实现边时，如果源或目标顶点缺失或不存在，则事务将回滚。

以下语句是Create Edge命令的基本语法。

CREATE EDGE <class> [CLUSTER <cluster>] FROM <rid>|(<query>)|[<rid>]* TO <rid>|(<query>)|[<rid>]*
     [SET <field> = <expression>[,]*]|CONTENT {<JSON>}
     [RETRY <retry> [WAIT <pauseBetweenRetriesInMs]] [BATCH <batch-size>]

以下是有关上述语法中选项的详细信息。

<class> - 定义边的类名。

<cluster> - 定义要存储边的集群。

JSON - 提供JSON内容作为记录。

RETRY - 定义发生冲突时尝试重试的次数。

WAIT - 定义重试之间的延迟时间，以毫秒为单位。

BATCH - 定义是否将命令分解为更小的块和批次的大小。

示例

执行以下查询以在两个顶点＃9:0和＃14:0之间创建边缘E.

orientdb> CREATE EDGE FROM #11:4 TO #13:2

如果上述查询成功执行，您将得到以下输出。

Created edge '[e[#10:0][#9:0->#14:0]]' in 0.012000 sec(s)

执行以下查询以创建新的边类型和新类型的边。

orientdb> CREATE CLASS E1 EXTENDS E
orientdb> CREATE EDGE E1 FROM #10:3 TO #11:4

如果上述查询成功执行，您将得到以下输出。

Created edge '[e[#10:1][#10:3->#11:4]]' in 0.011000 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB修改边 - OrientDB教程™

更新边命令用于更新当前数据库中的边记录。 这与实际更新命令等效，除了检查和维护与顶点的图一致性外，还更新out和in属性。

以下语句是更新边命令的基本语法。

UPDATE EDGE <edge>
   [SET|INCREMENT|ADD|REMOVE|PUT <field-name> = <field-value> [,]*]|[CONTENT|MERGE <JSON>]
   [RETURN <returning> [<returning-expression>]]
   [WHERE <conditions>]
   [LOCK default|record]
   [LIMIT <max-records>] [TIMEOUT <timeout>]

以下是有关上述语法中选项的详细信息。

<edge> - 定义您想要更新的边。 您可以选择按类别更新边的类，按簇更新边的簇，使用CLUSTER前缀或按记录ID更新边的记录ID。

SET - 将字段更新为给定的值。

INCREMENT - 增加给定字段的值。

ADD - 定义要添加到字段集合的项目。

REMOVE - 定义要从一组字段中删除的项目。

PUT - 定义要放入地图字段的条目。

RETURN - 定义运行更新后要返回的表达式。

WHERE - 定义过滤条件。

LOCK - 定义记录如何在加载和更新之间锁定。

LIMIT - 定义最大记录数。

示例

考虑通过从address表中获取具有区域Id = 001和人名为Krishna的数据来更新Person中名为Edge的边的例子。

orientdb> UPDATE EDGE address SET out = (SELECT FROM Address WHERE areaID = 001)
WHERE name = 'krishna'

如果上述查询成功执行，您将得到以下输出。

Updated edge '[address[#10:3][#11:3->#14:2]]' in 0.012000 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB删除边 - OrientDB教程™

删除边(Delete Edge)命令用于删除数据库。 这相当于删除命令，除了通过从in和out顶点属性中删除边的所有交叉引用来检查并保持与顶点的一致性之外。

以下语句是删除边命令的基本语法。

DELETE EDGE
   ( <rid>
      |
      [<rid> (, <rid>)*]
      |
      ( [ FROM (<rid> | <select_statement> ) ] [ TO ( <rid> | <select_statement> ) ] )
      |
      [<class>]
   (
      [WHERE <conditions>]
      [LIMIT <MaxRecords>]
      [BATCH <batch-size>]
   ))

以下是有关上述语法中选项的详细信息。

FROM - 定义要删除的边的起点顶点。

To - 定义要删除的边的终点顶点。

WHERE - 定义过滤条件。

LIMIT - 定义要删除的最大边数。

BATCH - 定义操作的块大小。

示例

尝试以下示例以了解如何删除边。

执行以下查询以删除两个顶点之间的边(＃11:2，＃11:10)。 但是在两个顶点之间可能存在一个或多个边。 所以使用date属性来获得正确的功能。 该查询将删除'2015-01-15'及此日期之后创建的边。

orientdb {db = demo}> DELETE EDGE FROM #11:2 TO #11:10 WHERE date >= "2012-01-15"

如果上述查询成功执行，您将得到以下输出。

Delete record(s) '2' in 0.00200 sec(s)

执行以下查询以删除从顶点＃11:5到顶点＃11:10以及与class=Customer相关的边。

orientdb {db = demo}> DELETE EDGE FROM #11:5 TO #11:10 WHERE @class = 'Customer'

如果上述查询成功执行，您将得到以下输出。

Delete record(s) '2' in 0.00200 sec(s)

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB高级概念

OrientDB函数 - OrientDB教程™

本章介绍OrientDB中不同类型函数的完整参考。 下表定义了按功能分类的函数列表。

图函数

用于操纵图形数据的函数。

编号 | 函数名称 | 说明
1 | Out() | 获取从当前记录开始的相邻传出顶点作为顶点。语法:out([<label-1>][,<label-n>]*)
2 | In() | 获取从当前记录开始的相邻传入顶点作为顶点。语法:in([<label-1>][,<label-n>]*)
3 | Both() | 获取从当前记录开始的相邻传出和传入顶点作为顶点。语法:both([<label1>][,<label-n>]*)
4 | outE() | 获取从当前记录开始的相邻传出边作为顶点。语法:outE([<label1>][,<label-n>]*)
5 | inE() | 获取从当前记录开始的邻近传入边作为顶点。语法:inE([<label1>][,<label-n>]*)
6 | bothE() | 获取从当前记录开始的相邻传出和传入边作为顶点。语法:bothE([<label1>][,<label-n>]*)
7 | outV() | 获取从当前记录开始的传出顶点作为Edge。语法:outV()
8 | inV() | 从当前记录中获取进入的顶点作为边。语法:inV()
9 | traversedElement() | 返回遍历命令中的遍历元素。语法:traversedElement(<index> [,<items>])
10 | traversedVertex() | 在遍历命令中返回遍历的顶点。语法:traversedVertex(<index> [,<items>])
11 | traversedEdge() | 返回遍历命令中的遍历边。语法:traversedEdge(<index> [,<items>])
12 | shortestPath() | 返回两个顶点之间的最短路径。 方向可以是OUT(默认)，IN或BOTH。
13 | dijkstra() | 使用Dijkstra算法返回两个顶点之间最便宜的路径。语法:dijkstra(<sourceVertex>, <destinationVertex>, <weightEdgeFieldName> [, <direction>])

尝试一些图函数以及以下查询。

执行以下查询以获取所有车辆顶点的所有传出顶点。

orientdb {db = demo}>SELECT out() from Vehicle

如果上述查询成功执行，您将得到以下输出。

---+----------+---------
 # | @class   | out
---+----------+---------
 0 | Vehicle  | #11:2
 1 | Vehicle  | #13:1
 2 | Vehicle  | #13:4
---+----------+---------

执行以下查询以从顶点＃11:3获取传入和传出顶点。

orientdb {db = demo}>SELECT both() FROM #11:3

如果上述查询成功执行，您将得到以下输出。

---+----------+--------+-------
 # | @class   | out    | in
---+----------+--------+-------
 0 | Vehicle  | #13:2  | #10:2
 ---+----------+-------+-------
`

数学函数

下表定义了用于执行数学表达式的数学函数的列表。

编号 | 函数 | 描述
1 | eval() | 计算引号(或双引号)之间的表达式。语法:eval('<expression>')
2 | min() | 返回最小值。 如果用多个参数调用，则它返回所有参数之间的最小参数值。语法:min(<field> [, <field-n>]* )
3 | max() | 返回最大值。 如果调用多个参数，则返回所有参数之间的最大值。语法:max(<field> [, <field-n>]* )
4 | sum() | 返回所有返回值的总和。语法:sum(<field>)
5 | abs() | 返回绝对值。 它适用于Integer，Long，Short，Double，Float，BigInteger，BigDecimal，null。
6 | avg() | 返回平均值。语法:avg(<field>)
7 | count() | 计算与查询条件相匹配的记录。 如果*未用作字段，则只有在内容不为空时，记录才会被计数。语法:count(<field>)
8 | mode() | 返回频率最高的值，计算中忽略空值。语法:mode(<field>)
9 | median() | 返回中间值或插值后的值，该值表示对值进行排序后的中间值。 计算中忽略空值。语法:median(<field>)
10 | percentile() | 返回第n个百分点。 计算中忽略空值。语法:percentile(<field> [, <quantile-n>]*)
11 | variance() | 返回中间方差:平均值与平均值的平方差。语法:variance(<field>)
12 | stddev() | 返回标准偏差:衡量值是如何分布的。 计算中忽略空值。语法:stddev(<field>)

使用以下查询尝试一些数学函数。
执行以下查询以获得所有员工的工资总和。

orientdb {db = demo}>SELECT SUM(salary) FROM Employee

如果上述查询成功执行，您将得到以下输出。

---+----------+---------
 # | @CLASS   | sum
---+----------+---------
 0 | null     | 150000
---+----------+---------

执行以下查询以获得所有员工的平均薪水。

orientdb {db = demo}>SELECT avg(salary) FROM Employee

如果上述查询成功执行，您将得到以下输出。

---+----------+---------
 # | @CLASS   | avg
---+----------+---------
 0 | null     | 25
---+----------+---------

集合函数

下表定义了操作集合数据的函数列表。

编号 | 函数 | 描述
1 | set() | 为一个集合添加一个值。 如果该值是一个集合，那么它将与该集合合并，否则会添加<value>。语法:set(<field>)
2 | map() | 首次创建映射时向映射添加值。 如果<value>是一个映射，则它将与该映射合并，否则会将<key>和<value>对添加到映射为新条目。语法:map(<key>, <value>)
3 | ist() | 添加一个值以列出第一次创建列表。 如果<value>是一个集合，那么它将与该列表合并，否则将<value>添加到列表中。语法:list(<field>)
4 | difference() | 作为汇总或内联工作。 如果只传递一个参数，则聚合，否则执行，并返回作为参数接收的集合之间的差异。语法:difference(<field> [,<field-n>]*)
5 | first() | 仅检索多值字段的第一项(数组，集合和映射)。 对于非多值类型，只返回值。语法:first(<field>)
6 | intersect() | 作为汇总或内联工作。 如果只传递一个参数，则聚合，否则执行并返回作为参数接收的集合的交互。语法:intersect(<field> [,<field-n>]*)
7 | distinct() | 根据您指定为参数的字段仅检索唯一数据条目。 与标准SQL DISTINCT相比，主要区别在于使用OrientDB时，可以指定带括号且只有一个字段的函数。语法:distinct(<field>)
8 | expand() | 这个函数有两个含义 - 1.在集合字段上使用时，它将展开字段中的集合并将其作为结果使用。2. 在链接(RID)字段上使用时，它会扩展该链接指向的文档。语法:expand(<field>)
9 | unionall() | 作为汇总或内联工作。 如果只传递一个参数，则聚合，否则执行并返回作为参数接收的所有集合的UNION。 也适用于没有收集值。语法:unionall(<field> [,<field-n>]*)
10 | flatten() | 在字段中提取集合并将其用作结果。 已弃用，请使用expand()。
11 | last() | 仅检索多值字段的最后一项(数组，集合和映射)。 对于非多值类型，只返回值。语法:last(<field>)
12 | symmetricDifference() |
13 | 作为汇总或内联工作。 如果只传递一个参数，则聚集，否则执行并返回作为参数接收的集合之间的对称差分。语法:symmetricDifference(<field> [,<field-n>]*)

以下查询尝试一些集合函数的使用。

执行以下查询以获得一组教师，教第9班。

orientdb {db = demo}>SELECT ID, set(teacher.id) AS teacherID from classess where class_id = 9

如果上述查询成功执行，您将得到以下输出。

---+----------+--------+--------------------------
 # | @CLASS   | id     | TeacherID
---+----------+--------+--------------------------
 0 | null     | 9     |   1201, 1202, 1205, 1208
---+----------+-------+---------------------------

杂项函数

下表定义了执行杂项操作的函数列表。

编号 | 函数 | 描述
1 | date() | 返回格式化字符串的日期。 <date-as-string>是字符串格式的日期，<format>是遵循这些规则的日期格式。语法:date( <date-as-string> [<format>] [,<timezone>] )
2 | sysdate() | 返回当前的日期和时间。语法:sysdate( [<format>] [,<timezone>] )
3 | format() | 使用String.format()约定格式化一个值。语法:format( <format> [,<arg1> ](,<arg-n>]*.md)
4 | distance() | 使用Haversine算法返回全球两点之间的距离。 坐标必须是度数。语法:distance( <x-field>, <y-field>, <x-value>, <y-value> )
5 | ifnull() | 返回传递的字段/值(或可选参数return_value_if_not_null)。 如果field/value不为null，则返回return_value_if_null。语法:`ifnull(<field | value>, ,`
6 | coalesce() | 返回第一个字段/值非空参数。 如果没有字段/值不为空，则返回null。语法:`coalesce(<field | value> [, <field-n | value-n>]*)`
7 | uuid() | 使用Leach-Salz变体生成一个128位的UUID值。语法:uuid()
8 | if() | 评估条件(第一个参数)，如果条件为真，则返回第二个参数，否则返回第三个参数。语法:if(<expression>, <result-if-true>, <result-if-false>)

使用以下查询尝试一些其它函数。
执行以下查询以了解如何执行表达式。

orientdb {db = demo}> SELECT if(eval("name = 'satish'"), "My name is satish",
"My name is not satish") FROM Employee

如果上述查询成功执行，您将得到以下输出。

----+--------+-----------------------
#   |@CLASS  | IF
----+--------+-----------------------
0   |null    |My name is satish
1   |null    |My name is not satish
2   |null    |My name is not satish
3   |null    |My name is not satish
4   |null    |My name is not satish
----+--------+------------------------

执行以下查询以获取系统日期。

orientdb {db = demo}> SELECT SYSDATE() FROM Employee

如果上述查询成功执行，您将得到以下输出。

----+--------+-----------------------
#   |@CLASS  | SYSDATE
----+--------+-----------------------
0   |null    |2016-02-10 12:05:06
1   |null    |2016-02-10 12:05:06
2   |null    |2016-02-10 12:05:06
3   |null    |2016-02-10 12:05:06
4   |null    |2016-02-10 12:05:06
----+--------+------------------------

通过彻底使用此函数，可以轻松操纵OrientDB数据。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB序列 - OrientDB教程™

序列是一个用于自动增量机制的概念，它在OrientDB v2.2中引入。 在数据库术语中，序列是管理计数器字段的结构。 简单地说，当你需要一个始终增加的数字时，主要使用这些序列。 它支持两种类型 -

ORDERED - 每次指针调用.next()方法返回新值。

CACHED - 该序列将在每个节点上缓存N个项目。 调用每个项目使用.next()，当缓存包含多个项目时，这是首选项。

创建序列

序列通常用于自动增加一个id值。 OrientDB与其他SQL概念一样，它也会执行与RDBMS中的序列类似的操作。

以下语句是创建序列的基本语法。

CREATE SEQUENCE <sequence> TYPE <CACHED|ORDERED> [START <start>]
[INCREMENT <increment>] [CACHE <cache>]

以下是有关上述语法中选项的详细信息。

<Sequence> - 序列的本地名称。

TYPE - 定义ORDERED或CACHED的序列类型。

START - 定义初始值。

INCREMENT - 定义每个.next方法调用的增量。

CACHE - 定义在用于缓存序列类型的情况下预先缓存的值的数量。

下面创建一个名为seqid的序列，它的编号是以1201开始。尝试以下查询以按顺序实现此示例。

CREATE SEQUENCE seqid START 1201

如果上述查询成功执行，将得到以下输出。

Sequence created successfully

尝试以下查询以使用序列seqid插入account表的id列的值。

INSERT INTO Account SET id = sequence('seqid').next()

如果上述查询成功执行，您将得到以下输出。

Insert 1 record(s) in 0.001000 sec(s)

修改序列

修改序列是用来改变序列属性的命令。 它将修改序列类型以外的所有序列选项。

以下语句是alter sequence命令的基本语法。

ALTER SEQUENCE <sequence> [START <start-point>]
[INCREMENT <increment>] [CACHE <cache>]

以下是有关上述语法中选项的详细信息。

<Sequence> - 定义想要更改的序列。

START - 定义初始值。

INCREMENT - 定义每个.next方法调用的增量。

CACHE - 定义在用于缓存序列类型的事件中预先缓存的值的数量。

尝试以下查询，将名为seqid的序列的起始值从1201修改为1000。

ALTER SEQUENCE seqid START 1000

执行上面示例代码，得到以下结果 -

Altered sequence successfully

删除序列

Drop sequence是用于删除序列的命令。

以下语句是删除序列的基本语法。

DROP SEQUENCE <sequence>

其中<sequence>定义想要删除的序列。

尝试以下查询以删除名为seqid的序列。

DROP SEQUENCE seqid

如果上述查询成功执行，您将得到以下输出。

Sequence dropped successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB索引 - OrientDB教程™

索引是一个指向数据库中数据位置的指针。 索引是一种用于快速定位数据而不必搜索数据库中的每条记录的概念。 OrientDB支持四种索引算法和几种类型。

四种类型索引分别是 -

SB-Tree索引

它提供了来自其他索引类型的很好的功能组合。 最好将其用于一般效用。 它是耐用的，事务性的并且支持范围查询。 它是默认的索引类型。 支持这种算法的不同类型的插件是 -

UNIQUE - 这些索引不允许重复键。对于复合索引，这指的是复合键的唯一性。

NOTUNIQUE - 这些索引允许重复键。

FULLTEXT - 这些索引基于任何单个文字。可以通过CONTAINSTEXT运算符在查询中使用它们。

DICTIONARY - 这些索引与使用UNIQUE的索引类似，但在重复键的情况下，它们会用新记录替换现有记录。

散列索引

它执行速度更快，磁盘使用率非常低。 它是持久的，事务性的，但不支持范围查询。 它像HASHMAP一样工作，这使得它在准时查找中更快，并且比其他索引类型消耗更少的资源。 支持这种算法的不同类型的插件是 -

UNIQUE_HASH_INDEX - 这些索引不允许重复键。 对于复合索引，这指的是复合键的唯一性。

NOTUNIQUE_HASH_INDEX - 这些索引允许重复键。

FULLTEXT_HASH_INDEX - 这些索引基于任何单个文本字。可以通过CONTAINSTEXT运算符在查询中使用它们。

DICTIONARY_HASH_INDEX - 这些索引与使用UNIQUE_HASH_INDEX的索引类似，但在重复键的情况下，它们会用新记录替换现有记录。

Lucene全文索引

它提供了很好的全文索引，但不能用于索引其他类型。 它是持久的，事务性的，并且支持范围查询。

Lucene空间索引

它提供了很好的空间索引，但不能用于索引其他类型。 它是持久的，事务性的，并且支持范围查询。

创建索引

创建索引是在特定模式上创建索引的命令。

以下语句是创建索引的基本语法。

CREATE INDEX <name> [ON <class-name> (prop-names)] <type> [<key-type>]
[METADATA {<metadata>}]

以下是有关上述语法中选项的详细信息。

<name> - 定义索引的逻辑名称。还可以使用<class.property>表示法创建绑定到模式属性的自动索引。 <class>使用模式类，<property>使用在类中创建的属性。

<class-name> - 提供要创建索引的自动索引的类的名称。该类必须存在于数据库中。

<prop-names> - 提供希望自动索引建立索引的属性列表。这些属性必须已经存在于模式中。

<type> - 提供您想要创建的索引的算法和类型。

<key-type> - 提供具有自动索引的可选键类型。

<metadata> - 提供JSON表示。

示例

尝试以下查询以创建绑定到sales_user的“ID”属性的自动索引。

orientdb> CREATE INDEX indexforID ON sales_user (id) UNIQUE

如果上述查询成功执行，您将得到以下输出。

Creating index...
Index created successfully with 4 entries in 0.021000 sec(s)

查询索引

可以使用select查询语句来获取索引中的记录。

尝试以下查询以检索名为indexforId的索引键。

SELECT FROM INDEX:indexforId

如果上述查询成功执行，您将得到以下输出。

----+------+----+-----
#   |@CLASS|key |rid
----+------+----+-----
0   |null  |1   |#11:7
1   |null  |2   |#11:6
2   |null  |3   |#11:5
3   |null  |4   |#11:8
----+------+----+-----

删除索引

如果想要删除一个特定的索引，可以使用这个命令。此操作不会删除链接的记录。

以下语句是删除索引的基本语法。

DROP INDEX <name>

其中<name>为指定想要删除的索引的名称。

尝试以下查询以删除sales_user的名为’ID’的索引。

DROP INDEX sales_users.Id

如果上述查询成功执行，您将得到以下输出。

Index dropped successfully

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB事务 - OrientDB教程™

和RDBMS一样，OrientDB支持事务ACID属性。 事务包括在数据库管理系统内执行的工作单元。 在数据库环境中维护事务有两个主要原因。

即使系统发生故障，也可以从故障中同时进行恢复并保持数据库的一致性。

在同时访问数据库的程序之间提供隔离。

默认情况下，数据库事务必须遵循ACID属性，例如Atomic，Consistent，Isolated和Durable属性。 但OrientDB是一个符合ACID的数据库，这意味着它不会抵触或否定ACID的概念，但它在处理NoSQL数据库时会改变它的看法。 看看ACID属性如何与NoSQL数据库一起使用。

原子性 - 当你做一些事情来改变数据库时，改变应该作为一个整体来工作或失败。

一致性 - 数据库应该保持一致。

隔离性 - 如果其他事务执行同时执行，则用户将无法在并发执行中查看记录。

持久性 - 如果系统崩溃(硬件或软件)，数据库本身应该能够进行备份。

数据库事务可以通过使用Commit 和 Rollback 命令来实现。

提交

提交意味着通过保存对数据库的所有更改来关闭事务。 回滚意味着将数据库状态恢复到您打开事务的位置。以下语句是COMMIT数据库命令的基本语法。

COMMIT

注 - 只有在连接到特定数据库并开始事务后，才能使用此命令。

示例

在本例中，将使用本教程前面章节中创建的名为demo的相同数据库。将看到提交事务的操作并使用事务来存储记录。

需要使用以下BEGIN命令首先启动事务。

orientdb {db = demo}> BEGIN

使用以下命令将记录值为id = 12和name = Maxsu插入到Employee表中。

orientdb> INSERT INTO employee (id, name) VALUES (12, 'Maxsu')

可以使用以下命令来提交事务。

orientdb> commit

如果此事务成功提交，将获得以下输出。

Transaction 2 has been committed in 4ms

回滚

回滚意味着将数据库状态恢复到您打开事务的位置。

以下语句是ROLLBACK数据库命令的基本语法。

ROLLBACK

注 - 只有在连接到特定数据库并开始事务后，才能使用此命令。

示例

在这个例子中，将使用本教程前面章节中创建的名为demo的相同数据库。 将看到回滚事务的操作并使用事务来存储记录。

先使用以下BEGIN命令启动事务。

orientdb {db = demo}> BEGIN

使用以下命令将记录值为id = 12和name = Maxsu插入到employee表中。

orientdb> INSERT INTO employee (id, name) VALUES (12, 'Maxsu')

可以使用以下命令来检索employee表中的记录。

orientdb> SELECT FROM employee WHERE name LIKE '%su'

如果此命令成功执行，您将获得以下输出。

---+-------+--------------------
 # | ID   | name
---+-------+--------------------
 0 | 12   | Maxsu
---+-------+--------------------
1 item(s) found. Query executed in 0.076 sec(s).

可以使用以下命令来回滚此事务。

orientdb> ROLLBACK

再次使用select查询语句从Employee表中检索相同的记录。

orientdb> SELECT FROM employee WHERE name LIKE '%su'

如果此命令成功执行，您将获得以下输出。

0 item(s) found. Query executed in 0.037 sec(s).

可以看到，上面插入的数据已被回滚了，所以没有查询到相关记录信息。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB钩子（触发器） - OrientDB教程™

OrientDB钩子类似于数据库术语中的触发器，它在用户应用程序中的每个CRUD操作之前和之后启用内部事件。可以使用挂钩编写自定义验证规则，强制执行安全性，或安排外部事件，例如针对关系DBMS进行复制。

OrientDB支持两种钩子 -

动态钩子 - 触发器，可以在类级别和/或文档级别构建。

Java(Native)钩子 - 触发器，可以使用Java类构建。

动态钩子
动态钩子比Java钩子更灵活，因为它们可以在运行时更改，并且可以根据需要运行每个文档，但比Java钩子慢。

要对文档执行钩子，首先将类扩展OTriggered基类。 之后，为相应的事件定义一个自定义属性。 以下是可用的事件。

onBeforeCreate - 在创建新文档之前调用。

onAfterCreate - 创建新文档后调用。

onBeforeRead - 在读取文档之前调用。

onAfterRead - 读取文档后调用。

onBeforeUpdate - 在更新文档之前调用。

onAfterUpdate - 更新文档后调用。

onBeforeDelete - 在删除文档之前调用。

onAfterDelete - 删除文档后调用。

动态挂钩可以调用 -

函数，SQL中，Javascript或OrientDB和JVM支持的任何语言编写。

Java静态方法。

类级别钩子

为与类相关的所有文档定义类级别钩子。 以下是一个示例，用于设置一个针对文档的类级别的钩子。

CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated

在Javascript中创建函数invoiceCreated，在服务器控制台中打印创建的票据编号。

CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript

现在通过创建一个新的票据文档来尝试钩子。

INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}

如果此命令成功执行，您将获得以下输出。

Invoice created: 100

文档级别钩子

只能针对一个或多个文档定义特殊操作。 要做到这一点，创建的类需要扩展OTriggered类。

例如，针对所有具有属性account ='Premium'的文档，现有的Profile类执行触发器，如JavaScript函数。 触发器将被调用以防止删除文档。

ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'

来创建一个preventDeletion()的Javascript函数。

CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript

然后通过尝试删除“Premium”帐户来测试钩子。

DELETE FROM #12:1
java.lang.RuntimeException: Cannot delete Premium profile
profile#12:1{onBeforeDelete:preventDeletion,account:Premium,name:Jill} v-1
(<Unknown source>#2) in <Unknown source> at line number 2

JAVA钩子

OrientDB Hooks(触发器)的一个常见用例是管理任何或所有类的创建和更新日期。 例如，无论何时创建一条记录，都可以设置一个CreatedDate字段，并且每当记录更新时设置一个UpdatedDate字段，并以您在数据库层实现逻辑一次的方式执行，而不必再次担心应用程序层。

创建完成后，您需要通过访问以下链接下载OrientDB核心来orientdb-core.jar文件。 然后将该jar文件复制到要存储Java源文件的文件夹中。

创建钩子文件

创建一个名为HookTest.java的Java文件，它将使用Java语言测试Hook机制。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;

public class HookTest extends ODocumentHookAbstract implements ORecordHook {
   public HookTest() {

   }

   @Override
   public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
      return DISTRIBUTED_EXECUTION_MODE.BOTH;
   }
   public RESULT onRecordBeforeCreate( ODocument iDocument ) {
      System.out.println("Ran create hook");
      return ORecordHook.RESULT.RECORD_NOT_CHANGED;
   }
   public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
      System.out.println("Ran update hook");
      return ORecordHook.RESULT.RECORD_NOT_CHANGED;
   }
}

每次创建或更新该类的记录时，上面的示例代码都会打印相应的注释。

再添加一个钩子文件setCreatedUpdatedDates.java，如下所示 -

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;

public class setCreatedUpdatedDates extends ODocumentHookAbstract implements ORecordHook {
   public setCreatedUpdatedDates() {

   }

   @Override
   public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
      return DISTRIBUTED_EXECUTION_MODE.BOTH;
   }
   public RESULT onRecordBeforeCreate( ODocument iDocument ) {
      if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
         iDocument.field("CreatedDate", System.currentTimeMillis() / 1000l);
         iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
         return ORecordHook.RESULT.RECORD_CHANGED;
      } else {
         return ORecordHook.RESULT.RECORD_NOT_CHANGED;
      }
   }

   public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
      if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
         iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
         return ORecordHook.RESULT.RECORD_CHANGED;
      } else {
         return ORecordHook.RESULT.RECORD_NOT_CHANGED;
      }
   }
}

上面的代码所做的是查找任何以字母'r'或't'开头的类，并在创建记录时设置CreatedDate和UpdatedDate，并在每次记录更新时设置UpdatedDate。

编译Java钩子

使用以下命令编译Java代码。

注:将下载的jar文件和这些Java文件保存到同一个文件夹中。

$ jar cf hooks-1.0-SNAPSHOT.jar *.java

将编译的代码移动到OrientDB服务器可以找到的位置

需要将完成的.jar文件复制到OrientDB服务器将查找它们的目录中。 一般是OrientDB服务器根目录下的'./lib'文件夹将如下所示 -

$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"

在OrientDB服务器配置文件中启用测试钩子

编辑$ORIENTDB_HOME/config/orientdb-server-config.xml并在文件末尾添加以下部分。

<orient-server>
 <hooks>
      <hook class = "HookTest" position = "REGULAR"/>
   </hooks>
   ...
</orient-server>

重新启动OrientDB服务器

当重新启动OrientDB服务器之后，在orientdb-server-config.xml中定义的挂钩现在处于活动状态。 启动OrientDB控制台，将其连接到数据库，然后运行以下命令 -

INSERT INTO V SET ID = 1;

如果此命令成功执行，您将获得以下输出。

Ran create hook

现在运行以下命令 -

UPDATE V SET ID = 2 WHERE ID = 1;

如果此命令成功执行，您将获得以下输出。

Ran update hook

在OrientDB服务器配置文件中启用Real Hook
编辑$ORIENTDB_HOME/config/orientdb-server-config.xml 并按如下方式更改钩子部分 -

<orient-server>
  <hooks>
      <hook class="setCreatedUpdatedDates" position="REGULAR"/>
   </hooks>
   ...
</orient-server>

重新启动OrientDB服务器

创建一个以字母r或t开头的新类 -

CREATE CLASS tTest EXTENDS V;

现在插入一条记录 -

INSERT INTO tTest SET ID = 1
SELECT FROM tTest

如果此命令成功执行，您将获得以下输出。

----+-----+------+----+-----------+-----------
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0   |#19:0|tTest |1   |1427597275 |1427597275
----+-----+------+----+-----------+-----------

即使您没有指定为CreatedDate和UpdatedDate设置值，OrientDB也会自动设置这些字段。

接下来，需要使用以下命令更新记录 -

UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;

如果此命令成功执行，您将获得以下输出。

----+-----+------+----+-----------+-----------
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0   |#19:0|tTest |2   |1427597275 |1427597306
----+-----+------+----+-----------+-----------

可以看到OrientDB已经改变了UpdatedDate字段的值，但CreatedDate的值保持不变。

OrientDB Java Hooks可以是一个非常有用的工具，可以帮助自动化工作，否则在应用程序代码中执行这些工作。 由于许多DBA并不总是Java专家，所以希望本教程中包含的信息能够让您领先一步，让您对该技术感到满意，从而使您能够在需要时成功创建数据库触发器。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB缓存 - OrientDB教程™

缓存是一个概念，它将创建数据库表结构的副本，为用户应用程序提供一个舒适的环境。 OrientDB在不同级别有多种缓存机制。

下面的插图给出了关于什么是缓存的说明。

在上图中，DB1，DB2，DB3是应用程序中使用的三种不同的数据库实例。

一级缓存是一个本地缓存，用于存储特定会话已知的所有实体。 如果您在此会话中有三笔交易，则它将持有所有三笔交易使用的所有实体。 当您关闭会话或执行“清除”方法时，此缓存将被清除。 它减少了应用程序和数据库之间I/O操作的负担，从而提高了性能。

二级缓存是使用第三方提供商的实时缓存。 你可以完全控制缓存的内容，也就是说你可以指定哪些项目应该被删除，哪些项目应该被存储更长时间等等。它是多个线程之间的完全共享缓存。

存储模型只不过是磁盘，内存或远程服务器的存储设备。

OrientDB缓存工作原理

OrientDB缓存在不同的环境中提供不同的方法。 缓存主要用于更快的数据库事务，减少事务的处理时间并提高性能。 以下流程图显示了缓存如何在本地模式和客户端 - 服务器模式下工作。

本地模式(嵌入式数据库)

以下流程图告诉您如何在本地模式下存储和使用的应用程序之间存在记录，即当数据库服务器位于本地主机中时。

当客户端应用程序请求OrientDB检查以下记录时 -

如果事务已经开始，那么它在事务内部搜索已更改的记录并在找到时返回它。

如果本地缓存已启用并包含所请求的记录，则将其返回。

如果此时记录不在高速缓存中，则请求存储(磁盘，内存)。

客户服务器模式(远程数据库)

以下流程图说明如何在客户端 - 服务器模式下，即数据库服务器位于远程位置时，记录位于存储和使用的应用程序之间。

当客户端应用程序要求记录时，OrientDB会检查以下内容 -

如果事务已经开始，那么它在事务内部搜索已更改的记录并在找到时返回它。

如果本地缓存已启用并包含所请求的记录，则将其返回。

此时，如果记录不在缓存中，则通过TCP/IP调用向服务器请求。

在服务器中，如果本地缓存已启用并包含所请求的记录，则返回该缓存。

此时，记录仍然不在服务器中缓存，然后向存储(磁盘，内存)请求。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB日志 - OrientDB教程™

OrientDB使用与Java虚拟机捆绑在一起的Java日志框架。 OrientDB的默认日志格式由OLogFormatter类管理。

以下语句是logging命令的基本语法。

<date> <level> <message> [<requester>]

以下是有关上述语法中选项的详细信息。

<date> - 它是以下格式的日志日期:yyyy-MM-dd HH:mm:ss:SSS。

<level> - 日志级别为5个字符的输出。

<message> - 这是日志文本，它可以是任何大小。

[<class>] - 它是记录的Java类(可选)。

支持的级别是包含在JRE类java.util.logging.Level中的级别。 他们是 -

SEVERE (最高值)

WARNING

INFO

CONFIG

FINE

FINER

FINEST (最低值)

默认情况下，安装两个记录器 -

控制台，作为启动应用程序/服务器的shell/命令提示符的输出。 可以通过设置变量'log.console.level'来改变。

文件，作为日志文件的输出。 可以通过设置'log.file.level'进行更改。

配置日志记录

日志记录策略和策略可以使用Java之后的文件进行配置。

语法 - Java日志记录配置。

示例

从orientdb-server-log.properties文件复制以下内容，并将其放入$ORIENTDB_HOME/config文件中。

# Specify the handlers to create in the root logger
# (all loggers are children of the root logger)
# The following creates two handlers
handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
# Set the default logging level for the root logger
.level = ALL

# Set the default logging level for new ConsoleHandler instances
java.util.logging.ConsoleHandler.level = INFO
# Set the default formatter for new ConsoleHandler instances
java.util.logging.ConsoleHandler.formatter =
   com.orientechnologies.common.log.OLogFormatter

# Set the default logging level for new FileHandler instances
java.util.logging.FileHandler.level = INFO
# Naming style for the output file
java.util.logging.FileHandler.pattern =../log/orient-server.log
# Set the default formatter for new FileHandler instances
java.util.logging.FileHandler.formatter = com.orientechnologies.common.log.OLogFormatter
# Limiting size of output file in bytes:
java.util.logging.FileHandler.limit = 10000000
# Number of output files to cycle through, by appending an
# integer to the base file name:
java.util.logging.FileHandler.count = 10

要告诉JVM放置属性文件的位置，需要为其设置java.util.logging.config.file系统属性。 例如，使用以下命令 -

$ java -Djava.util.logging.config.file=mylog.properties ...

设置日志记录级别

要在不修改日志记录配置的情况下更改日志记录级别，只需将“log.console.level”和“log.file.level”系统变量设置为所需的级别即可。

在启动时记录

以下是以不同方式在启动级别设置日志记录的过程。

在服务器配置中

打开文件orientdb-server-config.xml并在<properties>部分内的文件末尾添加或更新这些行 -

<entry value = "fine" name = "log.console.level" />
<entry value = "fine" name = "log.file.level" />

在Server.sh(或.bat)脚本中

使用java -D参数将系统属性“log.console.level”和“log.file.level”设置为所需的级别。

$ java -Dlog.console.level = FINE ...

在运行时记录

以下是以不同方式在启动级别设置日志记录的过程。

通过使用Java代码
使用System.setProperty()API可以在启动时设置系统变量。 以下代码片段是使用Java代码设置日志记录级别的语法。

public void main(String[] args){
   System.setProperty("log.console.level", "FINE");
   ...
}

在远程服务器上
对URL执行HTTP POST:/server/log.<type>/<level>，其中 -

<type>可以是console或file

<level>是支持的级别之一

示例

以下示例使用cURL对OrientDB Server执行HTTP POST命令。使用服务器的“root”用户和密码，用自己的密码替换。

启用最好的跟踪级别到控制台 -

curl -u root:root -X POST http://localhost:2480/server/log.console/FINEST

启用最好的跟踪级别文件 -

curl -u root:root -X POST http://localhost:2480/server/log.file/FINEST

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB性能调整 - OrientDB教程™

在本章中，可以了解一些关于如何优化使用OrientDB的应用程序的一般技巧。 有三种方法可以提高不同类型数据库的性能。

文档数据库性能调整 - 它使用一种技术来帮助避免为每个新文档创建文档。

对象数据库性能调整 - 它使用通用技术来提高性能。

分布式配置调整 - 它使用不同的方法来提高分布式配置的性能。

可以通过更改内存，JVM和远程连接设置来实现通用性能调整。

内存设置

内存设置有不同的策略来提高性能。

服务器和嵌入式设置

通过直接使用plocal，这些设置对于Java应用程序在嵌入模式下使用OrientDB运行的服务器组件和JVM都有效。

调整最重要的是确保内存设置是正确的。 真正区别的是在内存映射所使用的堆和虚拟内存之间进行正确的平衡，特别是在内存缓存结构计数少于原始IO的大型数据集(GB，TB等)时。

例如，如果您最多可以为Java进程分配8GB，那么分配小堆和大型磁盘缓存缓冲区(堆内存储器)通常会更好。

尝试以下命令以增加堆内存。

java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...

storage.diskCache.bufferSize设置(使用旧的local存储为file.mmap.maxMemory)以MB为单位，并指出要为磁盘高速缓存组件使用多少内存。 默认情况下它是4GB。

注 - 如果最大堆和磁盘高速缓存缓冲区的总和过高，则可能导致操作系统以极大的减速进行交换。

JVM设置

JVM设置在server.sh(和server.bat)批处理文件中编码。可以根据您的使用情况和硬件/软件设置更改它们以调整JVM。 在server.bat文件中添加以下行。

-server -XX:+PerfDisableSharedMem

该设置将禁止编写有关JVM的调试信息。 如果需要配置JVM，只需删除此设置即可。

远程连接

使用远程连接访问数据库时，有许多方法可以提高性能。

获取策略
当您使用远程数据库时，必须注意所使用的获取策略。 默认情况下，OrientDB客户端仅加载结果集中包含的记录。 例如，如果查询返回100个元素，但是如果您从客户端跨越这些元素，则OrientDB客户端会延迟地将这些元素加载到服务器的每个丢失记录的网络调用中。

网络连接池

默认情况下，每个客户端只使用一个网络连接与服务器交谈。 同一客户端上的多个线程共享同一个网络连接池。

当您有多个线程时，可能会有一个瓶颈，因为等待免费网络连接花费了大量时间。 这就是配置网络连接池非常重要的原因。

配置非常简单，只需2个参数 -

minPool - 它是连接池的初始大小。 默认值被配置为全局参数client.channel.minPool。

maxPool - 这是连接池可以达到的最大大小。 默认值被配置为全局参数client.channel.maxPool。

如果所有池连接都忙，则客户端线程将等待第一个空闲连接。
使用数据库属性进行配置的示例命令。

database = new ODatabaseDocumentTx("remote:localhost/demo");
database.setProperty("minPool", 2);
database.setProperty("maxPool", 5);

database.open("admin", "admin");

分布式配置调整

有许多方法可以提高分布式配置的性能。

使用事务
即使更新图表，也应该始终处理事务。常见情况是只读查询，如果发生故障，可以恢复大量和非并发操作。 在分布式配置上运行时，使用事务有助于减少延迟。 这是因为分布式操作只发生在提交时。 由于延迟，分配一个大的操作比传送小的多个操作要有效得多。

复制vs分片
OrientDB分布式配置设置为完全复制。 具有多个具有相同数据库副本的节点对于读取尺度很重要。 事实上，每个服务器都独立于执行读取和查询。 如果有10个服务器节点，则读取吞吐量为10倍。

写入后，情况正好相反:如果复制是同步的，则具有完全复制的多个节点会减慢操作速度。 在这种情况下，跨多个节点分割数据库允许您扩展写入，因为写入时只涉及一部分节点。 此外，您可以拥有一个比一个服务器节点HD更大的数据库。

在写入时放大
如果网络速度较慢，并且您有一个同步(默认)复制，则可以支付延迟成本。 事实上，当OrientDB同步运行时，它至少等待writeQuorum。 这意味着如果writeQuorum为3，并且您有5个节点，则协调器服务器节点(启动分布式操作的位置)必须等待来自至少3个节点的答案才能向客户端提供答案。

为了保持一致性，writeQuorum应该被设置为majority。 如果您有5个节点，则majority为3，使用4个节点时，它仍然为3。将writeQuorum设置为3而不是4或5可以降低延迟成本并保持一致性。

异步复制

为了加快速度，可以设置异步复制来消除延迟瓶颈。 在这种情况下，协调器服务器节点在本地执行操作并将答案提供给客户端。 整个复制将在后台进行。 如果未达到法定人数，则更改将透明回滚。

在读取上放大

如果您已经将writeQuorum设置为majority节点，则可以将readQuorum保留为1(默认值)。 这加快了所有的读取。

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。

OrientDB升级 - OrientDB教程™

升级时，必须考虑版本号和格式。 有三种格式 - MAJOR，MINOR，PATCH。

MAJOR版本需要不兼容的API更改。

MINOR版本需要向后兼容的功能。

PTCH版本需要向后兼容的错误修复。

要在小版本和主版本之间同步，可能需要导出和导入数据库。 有时需要将数据库从LOCAL迁移到PLOCAL，并且需要将图形迁移到RidBag。

从LOCAL存储引擎迁移到PLOCAL

从版本1.5.x开始OrientDB附带一个全新的存储引擎:PLOCAL(分页本地)。 它像LOCAL一样持久，但以不同的方式存储信息。 以下几点显示了PLOCAL和LOCAL之间的比较 -

PLOCAL记录存储在群集文件中，而LOCAL则在群集和数据段之间进行分割。

由于写入追加模式，PLOCAL比LOCAL更持久。

PLOCAL在写入时有较小的争用锁定，这意味着更多的并发。

PLOCAL不使用内存映射技术(MMap)，因此行为更“可预测”。

要将本地存储迁移到新的PLOCAL，需要使用PLOCAL作为存储引擎导出和重新导入数据库。 以下是程序。

第1步 - 打开一个新的shell(Linux/Mac)或命令提示符(Windows)。
第2步 - 使用控制台导出数据库。 按照给定的命令将demo数据库导出到demo.json.gzip文件中。

$ bin/console.sh (or bin/console.bat under Windows)
orientdb> CONNECT DATABASE local:/temp/demo admin admin
orientdb> EXPORT DATABASE /temp/demo.json.gzip
orientdb> DISCONNECT

第3步 - 在本地文件系统上，使用plocal引擎创建一个新数据库 -

orientdb> CREATE DATABASE plocal:/temp/newdb admin admin plocal graph

第4步 - 将旧数据库导入新数据库。

orientdb> IMPORT DATABASE /temp/demo.json.gzip -preserveClusterIDs=true
orientdb> QUIT

如果在同一个JVM中访问数据库，请记得将URL local:更改为plocal:

将图形迁移到RidBag

从OrientDB 1.7开始，RidBag是一个默认集合，用于管理图形中的邻接关系。 虽然由MVRB-Tree管理的旧数据库完全兼容，但您可以将数据库更新为更新的格式。

可以通过控制台或使用ORidBagMigration类升级图形。

连接到数据库CONNECT plocal:databases / <graphdb-name>

运行升级图命令

易百教程移动端：请扫描本页面底部(右侧)二维码并关注微信公众号，回复："教程" 选择相关教程阅读或直接访问：http://m.yiibai.com 。