实验项目:Neo4j数据库的部署和操作
实验目的:熟练掌握Neo4j数据库的部署与配置方法,Neo4j中节点的创建、关系的创建、节点和关系的查询、标签和属性的更新、节点和关系的删除、聚合函数,Java和Python访问MongoDB的方法。
实验仪器:装有Linux操作系统的PC机。
实验内容步骤:
1. Neo4j数据库的部署与配置
(1)下载并解压缩
(2)修改bashrc(一般可以忽略)
(3)修改neo4j-community-3.5.25\conf下的neo4j.conf配置文件:
- 去掉第54、71、75、79前面的#
#### 允许远程访问
dbms.connectors.default_listen_address=0.0.0.0
##### 开启bolt服务,默认端口7687
dbms.connector.bolt.listen_address=:7687
##### 开启http服务,默认端口7474
dbms.connector.http.listen_address=:7474
##### 开启https服务,默认端口7473
dbms.connector.https.listen_address=:7473
(4)启动neo4f
-neo4j-community的bin目录下进入终端输入:
./neo4j console
(5)web端进入 http://localhost:7474/
- 默认用户名“neo4j”和密码“neo4j” ,需要修改密码
2. 学会使用Cypher语言操作Neo4j数据库
根据具体场景设计一个Neo4j数据库(画出数据库示意图)。例如:教务信息、图书信息等等,至少包含2类标签、5个节点和4个关系)。练习如下命令:
(1)创建节点(包括属性)、创建关系,显示建立的图数据库。
- 创建结点:
- 创建结点命令:
create(n)
- 例子:创建两个结点:
create ( n: Person { name: "Bob", sex: "male" }) return n
create ( m: Person { name: "Alice", sex: "male", age: 20 }) return m
- 创建关系:
- 使用CREATE命令建立关系:
CREATE (节点)-[r:关系标签 { 可选的关系属性 }] -> (另一个节点)
- 案例1(Bob和Alice创建一个单向friend_of关系):
MATCH (a: Person), (b: Person)
WHERE a.name = 'Bob' AND b.name = 'Alice'
CREATE (a) - [ r:friend_of { name:a.name + "and" + b.name }] -> (b)
RETURN r;
- 案例2(建立不同方向的关系):
CREATE (a) - [ r:friend { name:a.name + "and" + b.name }] -> (b)
CREATE(a) <- [ r:friend { name:a.name + "and" + b.name }] - (b)
- 案例3(同时建立三个节点和两个关系)
CREATE p = ( n: Person { name: "alice" }) - [ :play_with { game: "football" }] -> ( q:Person { name: "Chris" }) <- [:play_with { game: "tennis" }] - ( m: Person { name: "bob" })
RETURN p;
(2)查询节点和关系
- 查询所有结点:
match (n) return n
- 条件查询(查询指定标签、属性的节点):
natch ( n: Person) where n.name = "Bob" return n
- match多个内容:
match ( a: Person ), ( b: Person ) WHERE a.name = 'Bob' AND b.name = 'Alice' return a, b;
- 查询所有和bob有关的节点:
MATCH ( n:Person { name:'Bob' }) -- (p) RETURN p;
- 查询时,对关系的标签、属性、方向 进行限制:
- 对结点类型进行约束:
- MATCH中使用where子句和逻辑运算符:
- 在Where语句中约束关系:
- (3)更新标签或属性
- 利用set命令为结点和关系修改属性和标签:
MATCH ( n { name; 'alice' }) SET n.lastname = 'Jackson' RETURN n
- 使用null关键词,删除属性:
MATCH ( n { name: 'alice' }) SET n.lastname = null RETURN n
- 使用remove命令,删除属性和标签:
MATCH ( n { name: 'alice' }) REMOVE n.age, n.sex RETURN n;
- 修改标签:
MATCH ( n { name : 'alice' }) SET n: girl RETURN n
- 复制标签和属性:
MATCH ( n { name: 'Chris' }), ( m {name: 'bob' }) SET n.age = m.age RETURN n,m;
(4)删除节点和关系
- 删除符合条件的节点:
ATch ( n: Person { name: "Bob" }) DELETE n
- 删除节点和它所有的对外关系:
MATCH ( n { name: alice }) - [r] - () DELETE n, r
- 删除所有的节点和关系:
MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n, r
- (5)聚合函数
- 常见の聚合函数:count、sum、avg、max、min
MATCH ( n { name: 'bob" } RETURN count(*)
MATCH ( n:Person) RETURN avg(n.age)
3.编程实现Neo4j的访问
Java访问该Neo4j数据库:实现数据库的连接、节点和关系的创建、查询和删除。
(1)实现数据库的连接
- 通过Maven获取依赖包
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>4.2.0</version>
</dependency>
- 获取Driver与Transaction,测试是否连接(提前开启neo4j)
import org.neo4j.driver.*;
// Java导入方法
import static org.neo4j.driver.Values.parameters;
public class CallNeo4j {
private static Driver driver = null;
static{
// bolt: 这个驱动程序适用于bolt协议,假设是专用二进制协议比HTTP API更有效
// 输入用户名和密码
driver = GraphDatabase.driver("bolt://localhost:7687/", AuthTokens.basic("neo4j","******"));
}
public static void main(String[] args) {
Session session = driver.session();
Transaction transaction = session.beginTransaction();
transaction.commit();
driver.close();
}
}
(2)节点和关系的创建、查询
- 参考代码:
import org.neo4j.driver.*;
// Java导入方法
import static org.neo4j.driver.Values.parameters;
public class CallNeo4j {
private static Driver driver = null;
static{
// bolt: 这个驱动程序适用于bolt协议,假设是专用二进制协议比HTTP API更有效
// 输入用户名和密码
driver = GraphDatabase.driver("bolt://localhost:7687/",AuthTokens.basic("neo4j","******"));
}
public static void main(String[] args) {
Session session = driver.session();
Transaction transaction = session.beginTransaction();
transaction.run("match (n) detach delete n");
transaction.run("merge (n:Person{name:{name},age:{age},sex:{sex}})", parameters("age",25,"name","张三","sex","男"));
transaction.run("merge (n:Person{name:'小红',age:{age},sex:{sex}})", parameters("age",23,"sex","女"));
transaction.run("match (p1:Person{name:{p1_name}}),(p2:Person{name:{p2_name}}) create (p1)-[r:like{time:{time}}]->(p2)",
parameters("p1_name","张三","p2_name","小红","time",2));
// Integer.parseInt("xxxx"); // 成功后测试异常
Result result = transaction.run( "MATCH (p:Person) where p.name = {name} RETURN p.name AS name, p.age AS age",
parameters( "name", "张三" )); // return p,与此结果截然不同
while (result.hasNext())
{
Record record = result.next();
System.out.println(record);
System.out.println( record.get( "name" ).asString() + " " + record.get( "age" ));
}
transaction.commit();
driver.close();
}
}
(3)节点和关系的删除(略)
小结:
- Java连接neo4j数据库后,操作方法同Cypher语言
- Neo4j的Web操作界面可视化
【参考文件】
ubuntu20.04安装neo4jUbuntu系统neo4j的安装与使用史上最全—Neo4j 前端可视化组件及相关资源06_Java访问Neo4j数据库neo4j java_使用java操作Neo4j数据库