OrientDB
Getting-Started:https://www.orientdb.org/getting-started
一、MacOSX安装OrientDB
使用docker安装:
docker run -d --name orientdb -p 2424:2424 -p 2480:2480 -e ORIENTDB_ROOT_PASSWORD=root orientdb:latest
docker操作命令
# 停止容器
docker stop orientdb
# 开启容器
docker start orientdb
# 查看日志 tail后跟需要看的日志数量信息 使用ctrl+C退出日志
docker logs -tf --tail 50 orientdb
二、OrientDB基本操作
1、登陆操作页面
docker中orientDB容器在运行时,输入:
http://localhost:2480/studio/index.html
即可进入orientdb操作页面
2、创建数据库 Create a DB
点击NEW DB
新建名字为Mydb,用户名为root,密码为root的DB,点击CREATE DATABASE
尝试输入
SELECT * FROM OUser
并点击RUN按钮,可以得到如下结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cBtPZEwE-1600863812728)(/Users/yangbohan/Library/Application Support/typora-user-images/image-20200922151732781.png)]
3、OrientDB基本语法
- 除了以下的差别,OrientDB的语法与SQL的语法差不多
3.1 没有JOIN
OrientDB与传统关系型数据库的最大差别是关系用LINKS
来表示而不是用JOINS
来表示。所以传统的JOIN语法在OrientDB中不被支持。
在sql中,可以通过如下的代码创造一个Join
SELECT *
FROM Employee A, City B
WHERE A.city = B.id
AND B.name = 'Rome'
在OrientDB中,一个相等的操作如下:
SELECT * FROM Employee WHERE city.name = 'Rome'
这样变得更方便,方法更强大了。
3.2 投影
在SQL中,投影是强制性的并且可以用*
来显示所有的行。在OrientDB中*
是可选的。
传统SQL语句中,查询Customer所有的列语句如下:
SELECT * FROM Customer
而OrientDB中,*
可以不写
SELECT FROM Customer
3.3 不支持HAVING关键字
OrientDB不支持HAVING关键字,但是要得到同样的结果也很方便。
SQL中的例子:
SELECT city, sum(salary) AS salary
FROM Employee
GROUP BY city
HAVING salary > 1000
这个SQL语句把所有的工资通过城市分类,并且提取出工资总和超过1000的结果。在OrientDB中表达式如下:
SELECT FROM ( SELECT city, SUM(salary) AS salary FROM Employee GROUP BY city ) WHERE salary > 1000
三、 Java连接OrientDB
使用Idea,新建maven项目,在pom.xml文件中加入依赖
<project>
...
<dependencies>
...
<dependency>
<groupId>com.orientechnologies</groupId>
<artifactId>orientdb-client</artifactId>
<version>3.1.2</version>
</dependency>
...
</dependencies>
...
</project>
在/src/main/java下新建一个java class类,名称为OrientDB_Demo.java
写下
import com.orientechnologies.orient.core.db.ODatabaseSession;
import com.orientechnologies.orient.core.db.OrientDB;
import com.orientechnologies.orient.core.db.OrientDBConfig;
import com.orientechnologies.orient.core.metadata.schema.OClass;
import com.orientechnologies.orient.core.metadata.schema.OType;
import com.orientechnologies.orient.core.record.OEdge;
import com.orientechnologies.orient.core.record.OVertex;
import com.orientechnologies.orient.core.sql.executor.OResult;
import com.orientechnologies.orient.core.sql.executor.OResultSet;
import java.util.HashMap;
import java.util.Map;
public class OrientDB_Demo {
public static void main(String[] args) {
OrientDB orient = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig());
ODatabaseSession db = orient.open("Mydb", "root", "root");
createSchema(db);
createPeople(db);
executeAQuery(db);
executeAnotherQuery(db);
db.close();
orient.close();
}
private static void createSchema(ODatabaseSession db) {
OClass person = db.getClass("Person");
if (person == null) {
person = db.createVertexClass("Person");
}
if (person.getProperty("name") == null) {
person.createProperty("name", OType.STRING);
person.createIndex("Person_name_index", OClass.INDEX_TYPE.NOTUNIQUE, "name");
}
if (db.getClass("FriendOf") == null) {
db.createEdgeClass("FriendOf");
}
}
private static void createPeople(ODatabaseSession db) {
OVertex alice = createPerson(db, "Alice", "Foo");
OVertex bob = createPerson(db, "Bob", "Bar");
OVertex jim = createPerson(db, "Jim", "Baz");
OEdge edge1 = alice.addEdge(bob, "FriendOf");
edge1.save();
OEdge edge2 = bob.addEdge(jim, "FriendOf");
edge2.save();
}
private static OVertex createPerson(ODatabaseSession db, String name, String surname) {
OVertex result = db.newVertex("Person");
result.setProperty("name", name);
result.setProperty("surname", surname);
result.save();
return result;
}
private static void executeAQuery(ODatabaseSession db) {
String query = "SELECT expand(out('FriendOf').out('FriendOf')) from Person where name = ?";
OResultSet rs = db.query(query, "Alice");
while (rs.hasNext()) {
OResult item = rs.next();
System.out.println("friend: " + item.getProperty("name"));
}
rs.close(); //REMEMBER TO ALWAYS CLOSE THE RESULT SET!!!
}
private static void executeAnotherQuery(ODatabaseSession db) {
String query =
" MATCH " +
" {class:Person, as:a, where: (name = :name1)}, " +
" {class:Person, as:b, where: (name = :name2)}, " +
" {as:a} -FriendOf-> {as:x} -FriendOf-> {as:b} " +
" RETURN x.name as friend ";
Map<String, Object> params = new HashMap<String, Object>();
params.put("name1", "Alice");
params.put("name2", "Jim");
OResultSet rs = db.query(query, params);
while (rs.hasNext()) {
OResult item = rs.next();
System.out.println("friend: " + item.getProperty("friend"));
}
rs.close();
}
}
具体参照http://www.orientdb.org/docs/3.0.x/fiveminute/java.html
得到如下结果