Neo4j 图书馆借阅系统知识图谱设计

一、数据模型设计

节点类型

  1. 读者(Reader)
    • 属性: reader_id, name, age, gender, phone, email, register_date
  2. 图书(Book)
    • 属性: book_id, title, author, publisher, publish_date, isbn, price, category
  3. 图书副本(BookCopy)
    • 属性: copy_id, status (在馆/借出/维修), location
  4. 借阅记录(BorrowRecord)
    • 属性: record_id, borrow_date, due_date, return_date, fine_amount
  5. 图书馆员(Librarian)
    • 属性: staff_id, name, position, department
  6. 图书类别(Category)
    • 属性: category_id, name, description

关系类型

  1. (Reader)-[BORROWS]->(BorrowRecord)
  2. (BorrowRecord)-[FOR_BOOK]->(BookCopy)
  3. (BookCopy)-[INSTANCE_OF]->(Book)
  4. (Book)-[BELONGS_TO]->(Category)
  5. (Librarian)-[PROCESSES]->(BorrowRecord)
  6. (Book)-[WRITTEN_BY]->(Author) (如果需要单独的作者节点)

二、Cypher节点和关系创建图谱

复制代码
// 创建图书类别节点
CREATE (c1:Category {category_id: 'C001', name: '计算机科学', description: '计算机相关书籍'})
CREATE (c2:Category {category_id: 'C002', name: '文学', description: '小说、散文等文学作品'})
CREATE (c3:Category {category_id: 'C003', name: '历史', description: '历史类书籍'})

// 创建图书节点
CREATE (b1:Book {book_id: 'B001', title: 'Neo4j图数据库实战', author: '张三', publisher: '科技出版社', publish_date: '2020-01-01', isbn: '9781234567890', price: 59.90})
CREATE (b2:Book {book_id: 'B002', title: '百年孤独', author: '加西亚·马尔克斯', publisher: '文学出版社', publish_date: '1982-01-01', isbn: '9781234567891', price: 39.90})
CREATE (b3:Book {book_id: 'B003', title: '中国通史', author: '李四', publisher: '历史出版社', publish_date: '2015-01-01', isbn: '9781234567892', price: 49.90})

// 创建图书与类别的关系
MATCH (b:Book {book_id: 'B001'}), (c:Category {category_id: 'C001'})
CREATE (b)-[:BELONGS_TO]->(c)
MATCH (b:Book {book_id: 'B002'}), (c:Category {category_id: 'C002'})
CREATE (b)-[:BELONGS_TO]->(c)
MATCH (b:Book {book_id: 'B003'}), (c:Category {category_id: 'C003'})
CREATE (b)-[:BELONGS_TO]->(c)

// 创建图书副本节点
CREATE (bc1:BookCopy {copy_id: 'BC001', status: '在馆', location: 'A区3排2架'})
CREATE (bc2:BookCopy {copy_id: 'BC002', status: '借出', location: 'A区3排2架'})
CREATE (bc3:BookCopy {copy_id: 'BC003', status: '在馆', location: 'B区1排5架'})

// 创建副本与图书的关系
MATCH (b:Book {book_id: 'B001'}), (bc:BookCopy {copy_id: 'BC001'})
CREATE (bc)-[:INSTANCE_OF]->(b)

MATCH (b:Book {book_id: 'B001'}), (bc:BookCopy {copy_id: 'BC002'})
CREATE (bc)-[:INSTANCE_OF]->(b)

MATCH (b:Book {book_id: 'B002'}), (bc:BookCopy {copy_id: 'BC003'})
CREATE (bc)-[:INSTANCE_OF]->(b)

// 创建读者节点
CREATE (r1:Reader {reader_id: 'R001', name: '王五', age: 25, gender: '男', phone: '13800138000', email: 'wangwu@example.com', register_date: '2023-01-15'})
CREATE (r2:Reader {reader_id: 'R002', name: '李梅', age: 30, gender: '女', phone: '13900139000', email: 'limei@example.com', register_date: '2023-02-20'})

// 创建图书馆员节点
CREATE (l1:Librarian {staff_id: 'L001', name: '张管理员', position: '高级馆员', department: '借阅部'})

// 创建借阅记录节点
CREATE (br1:BorrowRecord {record_id: 'BR001', borrow_date: '2023-05-01', due_date: '2023-06-01', return_date: '', fine_amount: 0.0})
CREATE (br2:BorrowRecord {record_id: 'BR002', borrow_date: '2023-04-15', due_date: '2023-05-15', return_date: '2023-05-10', fine_amount: 0.0})

// 创建借阅关系
MATCH (r:Reader {reader_id: 'R001'}), (br:BorrowRecord {record_id: 'BR001'})
CREATE (r)-[:BORROWS]->(br)

MATCH (br:BorrowRecord {record_id: 'BR001'}), (bc:BookCopy {copy_id: 'BC002'})
CREATE (br)-[:FOR_BOOK]->(bc)

MATCH (l:Librarian {staff_id: 'L001'}), (br:BorrowRecord {record_id: 'BR001'})
CREATE (l)-[:PROCESSES]->(br)

MATCH (r:Reader {reader_id: 'R002'}), (br:BorrowRecord {record_id: 'BR002'})
CREATE (r)-[:BORROWS]->(br)

MATCH (br:BorrowRecord {record_id: 'BR002'}), (bc:BookCopy {copy_id: 'BC003'})
CREATE (br)-[:FOR_BOOK]->(bc)

MATCH (l:Librarian {staff_id: 'L001'}), (br:BorrowRecord {record_id: 'BR002'})
CREATE (l)-[:PROCESSES]->(br)

三、Cypher查询图谱

  1. 查询某读者的所有借阅记录:

    MATCH (r:Reader {name: '王五'})-[:BORROWS]->(br:BorrowRecord)-[:FOR_BOOK]->(bc:BookCopy)-[:INSTANCE_OF]->(b:Book)
    RETURN r.name AS Reader, b.title AS Book, br.borrow_date AS BorrowDate, br.due_date AS DueDate

  2. 查询逾期未还的图书:

    MATCH (br:BorrowRecord)
    WHERE date(br.due_date) < date() AND br.return_date IS NULL
    MATCH (r:Reader)-[:BORROWS]->(br)-[:FOR_BOOK]->(bc:BookCopy)-[:INSTANCE_OF]->(b:Book)
    RETURN r.name AS Reader, b.title AS Book, br.borrow_date AS BorrowDate, br.due_date AS DueDate

  3. 查询某类别下最受欢迎的图书:

    MATCH (c:Category {name: '计算机科学'})<-[:BELONGS_TO]-(b:Book)<-[:INSTANCE_OF]-(bc:BookCopy)<-[:FOR_BOOK]-(br:BorrowRecord)
    RETURN b.title AS Book, count(br) AS BorrowCount
    ORDER BY BorrowCount DESC
    LIMIT 5

  4. 查询读者的借阅偏好:

    MATCH (r:Reader {name: '李梅'})-[:BORROWS]->(br:BorrowRecord)-[:FOR_BOOK]->(bc:BookCopy)-[:INSTANCE_OF]->(b:Book)-[:BELONGS_TO]->(c:Category)
    RETURN c.name AS Category, count(*) AS BorrowCount
    ORDER BY BorrowCount DESC

四、可视化建议

  1. 使用不同颜色区分节点类型:
    • 读者: 蓝色
    • 图书: 绿色
    • 图书副本: 浅绿色
    • 借阅记录: 黄色
    • 类别: 紫色
    • 图书馆员: 红色
  2. 关系类型可以使用不同箭头样式或颜色表示不同类型的关系。
  3. 对于大型图谱,可以考虑按读者或图书类别进行子图筛选,避免可视化过于复杂。

这个知识图谱模型可以扩展添加更多细节,如预约记录、图书评价、续借记录等,根据实际需求进行调整。

相关推荐
沃尔威武1 小时前
数据库 Sinks(.net8)
数据库·.net·webview
青花瓷1 小时前
Ubuntu下OpenClaw的安装(豆包火山API版)
运维·服务器·ubuntu
Dreamboat¿2 小时前
SQL 注入漏洞
数据库·sql
Dream of maid2 小时前
Linux(下)
linux·运维·服务器
齐鲁大虾2 小时前
统信系统UOS常用命令集
linux·运维·服务器
曹牧3 小时前
Oracle数据库中,将JSON字符串转换为多行数据
数据库·oracle·json
被摘下的星星3 小时前
MySQL count()函数的用法
数据库·mysql
末央&3 小时前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花3 小时前
数据库知识复习07
数据库·作业
素玥4 小时前
实训5 python连接mysql数据库
数据库·python·mysql