使用Cypher进行图建模:书籍与作者该用属性还是独立节点?
图数据库中书籍与作者的建模方式及冗余问题解答
核心结论
在图数据库里,必须把书籍(Book)和作者(Author)设为独立节点,用关系关联,绝对不要把作者作为Book节点的属性。你写的Cypher代码里同时在Book节点存author属性、又创建Author节点和WROTE关系,属于明显的冗余设计,完全没必要。
为什么要做独立节点?
- 作者是独立实体:作者本身可能有很多额外属性(比如出生日期、国籍、代表作简介、获奖情况),做成节点后随时可以扩展这些信息,要是存在Book属性里根本没法添加这类内容。
- 避免数据冗余:像海明威写了两本书,存属性的话要重复写两次"Ernest Hemingway",用节点只需要存一次,后续修改作者信息也只改一处就行,不会出现数据不一致的问题。
- 查询更灵活:比如要找某个作者的所有作品、或者某本书作者的其他著作,用节点+关系的方式写Cypher查询会非常直观高效,要是存成属性,查起来反而麻烦。
修正后的Cypher代码
另外注意你原代码里有个错误:《The Great Gatsby》的作者是F. Scott Fitzgerald,应该是a2关联b2,你写成a1了,下面是修正后的无冗余代码:
CREATE (b1:Book {title: "The Catcher in the Rye"}), (b2:Book {title: "The Great Gatsby"}), (b3:Book {title: "The Old Man and the Sea"}), (b4:Book {title: "For Whom The Bell Tolls"}), (a1:Author {name: "J.D. Salinger"}), (a2:Author {name: "F. Scott Fitzgerald"}), (a3:Author {name: "Ernest Hemingway"}), (a1)-[:WROTE]->(b1), (a2)-[:WROTE]->(b2), (a3)-[:WROTE]->(b3), (a3)-[:WROTE]->(b4)
内容的提问来源于stack exchange,提问作者user20833054
相关产品推荐
相关产品推荐

