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

发布于:2025-05-17 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、数据模型设计

节点类型

  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
  1. 查询逾期未还的图书:
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
  1. 查询某类别下最受欢迎的图书:
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
  1. 查询读者的借阅偏好:
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. 对于大型图谱,可以考虑按读者或图书类别进行子图筛选,避免可视化过于复杂。

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


网站公告

今日签到

点亮在社区的每一天
去签到