实验项目:Neo4j数据库的部署和操作

实验目的:熟练掌握Neo4j数据库的部署与配置方法,Neo4j中节点的创建、关系的创建、节点和关系的查询、标签和属性的更新、节点和关系的删除、聚合函数,Java和Python访问MongoDB的方法。
实验仪器:装有Linux操作系统的PC机。

实验内容步骤

1. Neo4j数据库的部署与配置

(1)下载并解压缩

neo4j连接 springboot neo4j连接mongo_结点


(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;

neo4j连接 springboot neo4j连接mongo_neo4j连接 springboot_02


neo4j连接 springboot neo4j连接mongo_neo4j连接 springboot_03


(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语句中约束关系:
  • neo4j连接 springboot neo4j连接mongo_大数据_04


  • neo4j连接 springboot neo4j连接mongo_neo4j连接 springboot_05

  • (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;
  • neo4j连接 springboot neo4j连接mongo_结点_06


  • neo4j连接 springboot neo4j连接mongo_大数据_07


  • neo4j连接 springboot neo4j连接mongo_数据库_08

(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
  • neo4j连接 springboot neo4j连接mongo_结点_09

  • (5)聚合函数
  • 常见の聚合函数:count、sum、avg、max、min
  • MATCH ( n { name: 'bob" } RETURN count(*)
  • MATCH ( n:Person) RETURN avg(n.age)
  • neo4j连接 springboot neo4j连接mongo_neo4j连接 springboot_10


3.编程实现Neo4j的访问
Java访问该Neo4j数据库:实现数据库的连接、节点和关系的创建、查询和删除。

(1)实现数据库的连接

  • 通过Maven获取依赖包
<dependency>
    <groupId>org.neo4j.driver</groupId>
    <artifactId>neo4j-java-driver</artifactId>
    <version>4.2.0</version>
</dependency>

neo4j连接 springboot neo4j连接mongo_结点_11

  • 获取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();
    }
}

neo4j连接 springboot neo4j连接mongo_大数据_12

(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();
    }
}

neo4j连接 springboot neo4j连接mongo_数据库_13


(3)节点和关系的删除(略)

小结:

  • Java连接neo4j数据库后,操作方法同Cypher语言
  • Neo4j的Web操作界面可视化

【参考文件】
ubuntu20.04安装neo4jUbuntu系统neo4j的安装与使用史上最全—Neo4j 前端可视化组件及相关资源06_Java访问Neo4j数据库neo4j java_使用java操作Neo4j数据库