一、数据模型设计
节点类型
- 读者(Reader)
- 属性: reader_id, name, age, gender, phone, email, register_date
- 图书(Book)
- 属性: book_id, title, author, publisher, publish_date, isbn, price, category
- 图书副本(BookCopy)
- 属性: copy_id, status (在馆/借出/维修), location
- 借阅记录(BorrowRecord)
- 属性: record_id, borrow_date, due_date, return_date, fine_amount
- 图书馆员(Librarian)
- 属性: staff_id, name, position, department
- 图书类别(Category)
- 属性: category_id, name, description
关系类型
(Reader)-[BORROWS]->(BorrowRecord)
(BorrowRecord)-[FOR_BOOK]->(BookCopy)
(BookCopy)-[INSTANCE_OF]->(Book)
(Book)-[BELONGS_TO]->(Category)
(Librarian)-[PROCESSES]->(BorrowRecord)
(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查询图谱
-
查询某读者的所有借阅记录:
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 -
查询逾期未还的图书:
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 -
查询某类别下最受欢迎的图书:
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 -
查询读者的借阅偏好:
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
四、可视化建议
- 使用不同颜色区分节点类型:
- 读者: 蓝色
- 图书: 绿色
- 图书副本: 浅绿色
- 借阅记录: 黄色
- 类别: 紫色
- 图书馆员: 红色
- 关系类型可以使用不同箭头样式或颜色表示不同类型的关系。
- 对于大型图谱,可以考虑按读者或图书类别进行子图筛选,避免可视化过于复杂。
这个知识图谱模型可以扩展添加更多细节,如预约记录、图书评价、续借记录等,根据实际需求进行调整。