Neo4j的部署和操作
注:本博文展示部署哥操作步骤和命令,具体报告及运行截图可通过上方免费资源绑定下载
一.数据库的部署与配置
在单个节点上对进行数据库的单机部署
(1)上传neo4j-community-3.5.30-unix.tar.gz到hadoop1的/export/software目录
(2)解压缩neo4j:$ tar -xzf /export/software/neo4j-community-3.5.30-unix.tar.gz -C /export/servers/
(3)进入Neo4j解压缩目录,修改conf目录下的配置文件neo4j.conf
·cd /export/servers/neo4j-community-3.5.30
·vi conf/neo4j.conf
修改内容如下:
(4)启动Neo4j数据库:bin/neo4j start
(5)停止Neo4j数据库:bin/neo4j stop
(6)重启Neo4j数据库:bin/neo4j restart
- 查看Neo4j数据库的状态:bin/neo4j status
(8)使用web访问http://hadoop1:7474, 默认用户名和密码均为“neo4j”
(9)在输入框中输入指令可以显示教程:play start
二.使用命令访问数据库
1.节点和关系的创建:创建节点(包括属性)、创建关系、创建唯一节点。
(1)创建节点:创建三个Person节点,分别代表 Alice、Bob 和 Charlie,每个节点都有name和age属性。
·CREATE (a:Person {name: 'Alice', age: 28})
·CREATE (b:Person {name: 'Bob', age: 32})
·CREATE (c:Person {name: 'Charlie', age: 25})
- 创建关系:使用MATCH找到指定的节点(Alice, Bob, Charlie),然后使用CREATE创建关系KNOWS,表示他们之间相互认识。
// Alice 认识 Bob
·MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
·CREATE (a)-[:KNOWS]->(b)
// Bob 认识 Charlie
·MATCH (b:Person {name: 'Bob'}), (c:Person {name: 'Charlie'})
·CREATE (b)-[:KNOWS]->(c)
(3)创建唯一节点:确保只有一个名为 'Charlie' 的节点存在
·MERGE (d:Person {name: 'Charlie'})
2.节点和关系的查询:查询节点、条件查询、查询关系
(1)查询节点:查询所有Person节点并查看它们的name和age属性。
·MATCH (n:Person)
·RETURN n.name, n.age
- 条件查询:查询年龄大于30的用户,并返回他们的name和age。
·MATCH (n:Person)
·WHERE n.age > 30
·RETURN n.name, n.age
- 查询关系:查询所有的KNOWS关系,并返回两个节点(a和b)以及它们之间的关系(r)
·MATCH (a:Person)-[r:KNOWS]->(b:Person)
·RETURN a.name, b.name, r
3.更新标签或属性:更新属性、更新标签
(1)更新属性:更新name为'Alice'的Person节点的age属性为30
·MATCH (n:Person {name: 'Alice'})
·SET n.age = 30
(2)更新标签:给name为'Alice'的Person节点添加了一个新的标签Employee,表示她同时是Employee类型的节点。
·MATCH (n:Person {name: 'Alice'})
·SET n:Employee
上述操作更新后的节点表如下:
4.删除节点和关系:删除属性、删除节点、删除关系、删除所有的节点和关系
(1)删除属性:删除name为'Alice'的Person节点的age属性。
·MATCH (n:Person {name: 'Alice'})
·REMOVE n.age
(2)删除节点:删除name为'Bob'的Person节点
·MATCH (n:Person {name: 'Bob'})
·DETACH DELETE n
- 删除关系:删除名为 Alice 和 Bob 之间的 KNOWS 关系
·MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
·DELETE r
(4)删除所有的节点和关系:
·MATCH (n)
·DETACH DELETE n
三.数据库的设计
图书管理系统包含两个主要实体:图书和读者。它们之间通过一个关系来进行联系,借阅记录表示图书与读者之间的借阅关系,本系统共设计两个节点标签,分别是图书(存储图书的相关信息)和读者(存储读者的基本信息),一个关系标签借阅关系(表示图书与读者之间的借阅关系)。
1.数据库设计
(1)图书节点标签
标签名称:Book
属性:
title:图书名称
category:图书类别,如文学、小说等
published_date:图书出版日期
author_name:作者名称
author_birth_date:作者出生日期
publisher_name:出版商名称
publisher_address:出版商地址
(2)读者节点标签
标签名称:Reader
属性:
name:读者姓名
dob:读者出生日期
email:电子邮件
phone_number:联系电话
address:住址
(3)借阅关系标签
标签名称:BORROWED
连接节点:Reader与Book
属性:
borrow_date:借阅日期
return_date:归还日期
(4)实体与关系的增删改查
①新增操作
新增图书:使用 CREATE 命令添加新的图书节点(Book)。图书节点包括图书的标题、类别、出版日期、作者信息、出版商等属性。
新增借阅记录:使用 CREATE 命令在图书与读者之间建立一个新的借阅关系(BORROWED)。该关系包含借阅日期、归还日期等属性,连接已存在的读者节点(Reader)和图书节点(Book)。
新增读者:使用 CREATE 命令添加新的读者节点(Reader)。读者节点包括读者的姓名、出生日期、联系信息(如电话、地址、电子邮件等)等属性。
②删除操作
删除图书:使用 DELETE 命令删除指定的图书节点(Book)。删除时需要先找到该图书节点,可以通过图书标题等属性进行匹配。
删除借阅记录:使用 DELETE 命令删除图书与读者之间的借阅关系(BORROWED)。通过匹配读者和图书的具体信息,删除它们之间的借阅关系。
删除读者:使用 DELETE 命令删除指定的读者节点(Reader)。删除时需要先找到该读者节点,并确认与该读者相关的借阅关系(如果有)是否也需要删除。
③更新操作
更新图书信息:使用 SET 命令更新图书节点的某些属性,如图书的标题、作者、出版商等信息。通过匹配图书的具体属性(如标题),更新节点中的内容。
更新借阅记录:使用 SET 命令更新借阅关系的属性,如借阅日期、归还日期等。通过匹配特定的读者和图书,更新相应的借阅记录。
更新读者信息:使用 SET 命令更新读者节点的某些属性,如读者的姓名、电子邮件、联系电话等。通过匹配读者的具体信息(如姓名),更新该节点的内容。
④查询操作
查询某本图书的详细信息:使用 MATCH 命令查询图书节点的相关信息。可以根据图书的标题、作者或其他属性来查询图书的详细信息。
查询某本图书的借阅记录:使用 MATCH 命令查询所有借阅特定图书的记录。可以通过图书的标题或ID,找到借阅该图书的所有读者,以及借阅的日期和归还日期等信息。
查询某位读者的借阅记录:使用 MATCH 命令查询特定读者的所有借阅记录。通过读者的姓名或ID,查询该读者借阅的所有图书,并返回图书的详细信息(如标题、作者等)。
查询某位读者的详细信息:使用 MATCH 命令查询读者的详细信息。可以根据读者的姓名或ID,返回该读者的姓名、出生日期、联系方式等信息。
2.图设计与填充数据
(1)图书节点数据填充
CREATE (b1:Book {
title: '活着',
category: '文学',
published_date: '1993-06-01',
author_name: '余华',
author_birth_date: '1960-04-03',
publisher_name: '作家出版社',
publisher_address: '北京市朝阳区'
})
CREATE (b2:Book {
title: '百年孤独',
category: '小说',
published_date: '1967-06-05',
author_name: '加西亚·马尔克斯',
author_birth_date: '1927-03-06',
publisher_name: '南海出版公司',
publisher_address: '上海市徐汇区'
})
(2)读者节点数据填充
CREATE (r1:Reader {
name: '张三',
dob: '1990-05-15',
email: 'zhsan@email.com',
phone_number: '123-4567-8901',
address: '北京市海淀区'
})
CREATE (r2:Reader {
name: '李四',
dob: '2005-02-28',
email: 'lisi@email.com',
phone_number: '987-6543-2100',
address: '上海市浦东新区'
})
(3)借阅关系节点数据填充
MATCH (r:Reader {name: '张三'}), (b:Book {title: '活着'})
CREATE (r)-[:BORROWED {borrow_date: '2024-11-01', return_date: '2024-11-15'}]->(b)
MATCH (r:Reader {name: '李四'}), (b:Book {title: '百年孤独'})
CREATE (r)-[:BORROWED {borrow_date: '2024-11-02', return_date: '2024-11-20'}]->(b)
四.编程实现数据库的访问
使用Python访问实现设计的图书管理系统的Neo4j数据库,步骤如下:
(1)在Python中连接到Neo4j数据库:
import neo4j
# 数据库连接
uri = "neo4j://localhost:7687" # Neo4j默认连接端口
username = "neo4j"
password = "neo4j"
driver = neo4j.GraphDatabase.driver(uri, auth=(username, password))
(2)图书管理系统包含以下节点类型和关系:
Book:图书节点,包含书名、作者、出版日期等属性。
Reader:读者节点,包含姓名、联系方式等属性。
BORROWED:借阅关系,表示图书与读者之间的借阅关系,包含借阅日期和归还日期。
创建这些节点的函数:
def create_book(tx, title, category, published_date, author_name, author_birth_date, publisher_name, publisher_address):
query = (
"CREATE (b:Book {title: $title, category: $category, published_date: $published_date, "
"author_name: $author_name, author_birth_date: $author_birth_date, "
"publisher_name: $publisher_name, publisher_address: $publisher_address})"
)
tx.run(query, title=title, category=category, published_date=published_date,
author_name=author_name, author_birth_date=author_birth_date,
publisher_name=publisher_name, publisher_address=publisher_address)
def create_reader(tx, name, dob, email, phone_number, address):
query = (
"CREATE (r:Reader {name: $name, dob: $dob, email: $email, "
"phone_number: $phone_number, address: $address})"
)
tx.run(query, name=name, dob=dob, email=email, phone_number=phone_number, address=address)
(3)插入图书和读者:
def insert_data():
with driver.session() as session:
# 新增图书
session.write_transaction(create_book, "活着", "文学", "1993-06-01", "余华", "1960-04-03", "作家出版社", "北京市朝阳区")
session.write_transaction(create_book, "百年孤独", "小说", "1967-06-05", "加西亚·马尔克斯", "1927-03-06", "南海出版公司", "上海市徐汇区")
# 新增读者
session.write_transaction(create_reader, "张三", "1990-05-15", "zhsan@email.com", "123-4567-8901", "北京市海淀区")
session.write_transaction(create_reader, "李四", "2005-02-28", "lisi@email.com", "987-6543-2100", "上海市浦东新区")
(4)查询所有图书及其属性:
def get_all_books(tx):
query = "MATCH (b:Book) RETURN b.title AS title, b.author_name AS author, b.published_date AS published_date"
result = tx.run(query)
for record in result:
print(f"Title: {record['title']}, Author: {record['author']}, Published Date: {record['published_date']}")
(5)更新图书的出版日期:
def update_book(tx, title, new_publish_date):
query = "MATCH (b:Book {title: $title}) SET b.published_date = $new_publish_date"
tx.run(query, title=title, new_publish_date=new_publish_date)
更新《活着》:session.write_transaction(update_book, "活着", "1993-07-01")
(6)删除某本图书和读者节点:
def delete_book(tx, title):
query = "MATCH (b:Book {title: $title}) DELETE b"
tx.run(query, title=title)
def delete_reader(tx, name):
query = "MATCH (r:Reader {name: $name}) DELETE r"
tx.run(query, name=name)
(7)建立图书与读者之间的借阅关系:
def create_borrowed_relationship(tx, book_title, reader_name, borrow_date, return_date):
query = (
"MATCH (b:Book {title: $book_title}), (r:Reader {name: $reader_name}) "
"CREATE (r)-[:BORROWED {borrow_date: $borrow_date, return_date: $return_date}]->(b)"
)
tx.run(query, book_title=book_title, reader_name=reader_name, borrow_date=borrow_date, return_date=return_date)
建立张三与《活着》之间的关系:session.write_transaction(create_borrowed_relationship, "活着", "张三", "2024-11-01", "2024-11-15")