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: '[email protected]', register_date: '2023-01-15'})
CREATE (r2:Reader {reader_id: 'R002', name: '李梅', age: 30, gender: '女', phone: '13900139000', email: '[email protected]', 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. 对于大型图谱,可以考虑按读者或图书类别进行子图筛选,避免可视化过于复杂。

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

相关推荐
lyrhhhhhhhh21 分钟前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
惜.己1 小时前
Linux常用命令(十四)
linux·运维·服务器
喝醉的小喵2 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
BillKu2 小时前
服务器多JAR程序运行与管理指南
运维·服务器·jar
付出不多2 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆2 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams2 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存
QQ2740287562 小时前
BlockMesh Ai项目 监控节点部署教程
运维·服务器·web3
源码云商2 小时前
【带文档】网上点餐系统 springboot + vue 全栈项目实战(源码+数据库+万字说明文档)
数据库·vue.js·spring boot
源远流长jerry3 小时前
MySQL的缓存策略
数据库·mysql·缓存