麻烦建立一个neo4j
标签, 分不够没法建立这篇文件是用来颠覆那些过去在关系数据库中建立
无限分类
的同窗的三观的!
用图来解决这种问题, 是否是很Easy!
因此, 选择最合适的工具解决特定问题数据库还有: 目前在RDBMS中比较难处理的问题, 均可以在图数据库当中很轻巧的解决.函数
Neo4j 把数据存储为节点和关系, 属性以键值对的形式存储, 并链接到节点或者关系. 关系链接两个节点, 而且关系是有类型和方向的.工具
关系能够双向遍历. 关系类型是经过名称来标识的.spa
把分类
建模为节点, 有公共的属性: {id: 1, name: "名称"}
.插件
若是咱们须要跟踪节点的生命周期, 还能够在节点上增长created_at
,updated_at
,deleted_at
等属性.
建立分类根和惟一约束code
CREATE (c:category_root {id: 1, name: "分类根"}) CREATE CONSTRAINT ON (c:category_root) ASSERT c.id IS UNIQUE
那么,id
就要求惟一了, 若是咱们再次执行 CREATE (c:category_root {id: 1, name: "分类根"})
, 将会抛出下面的错误:orm
添加子分类生命周期
CREATE (:category {id: 2, name: "食品"}) CREATE (:category {id: 3, name: "出版物"}) CREATE (:category {id: 4, name: "服装"})
建立关系ip
MATCH (root:category_root {id: 1}), (c:category {name: "食品"}) CREATE (root)-[:children]->(c) MATCH (root:category_root {id: 1}), (c:category {name: "出版物"}) CREATE (root)-[:children]->(c) MATCH (root:category_root {id: 1}), (c:category {name: "服装"}) CREATE (root)-[:children]->(c)
获取分类信息树(JSON)it
// 获取分类树的JSON返回 MATCH p = (root:category_root)-[r:children]->(c:category) WITH collect(p) AS paths CALL apoc.convert.toTree(paths) YIELD value RETURN value
返回的结果为
{ "_type": "category_root", "name": "分类根", "_id": 21193, "id": 1, "children": [ { "_type": "category", "name": "食品", "_id": 16121, "id": 2 }, { "_type": "category", "name": "服装", "_id": 21174, "id": 3 }, { "_type": "category", "name": "出版物", "_id": 21175, "id": 4 } ] }
要作成下面这种样子么? 本身触类旁通了!
分类树可视化
MATCH p = (root:category_root)-[r:children]->(c:category) RETURN p
带上时间戳
CREATE (c:category_root {id: 2, name: "分类根", create_at: timestamp(), updated_at: timestamp(), deleted_at: null}) MATCH (c:category_root {id: 2}) RETURN c;
时间格式能够用apoc.date.format
函数来转换
MATCH (c:category_root {id: 2, name: "分类根"}) RETURN apoc.date.format(c.create_at, "ms", "yyyy-MM-dd hh:mm:ss")