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. 对于大型图谱,可以考虑按读者或图书类别进行子图筛选,避免可视化过于复杂。

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

相关推荐
搬码临时工17 分钟前
电脑同时连接内网和外网的方法,附外网连接局域网的操作设置
运维·服务器·网络
程序猿小D2 小时前
第16节 Node.js 文件系统
linux·服务器·前端·node.js·编辑器·vim
寒山李白2 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
文牧之3 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
deriva3 小时前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql
Leo.yuan4 小时前
数据库同步是什么意思?数据库架构有哪些?
大数据·数据库·oracle·数据分析·数据库架构
Kookoos4 小时前
ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询
数据库·c#·.net·neo4j·abp vnext
IT界小黑的对象4 小时前
virtualBox部署ubuntu22.04虚拟机 NAT+host only 宿主机ping不通虚拟机
linux·运维·服务器
云之兕5 小时前
MyBatis 的动态 SQL
数据库·sql·mybatis
gaoliheng0065 小时前
Redis看门狗机制
java·数据库·redis