麻烦创建一个neo4j
标签, 分不够无法创建这篇文件是用来颠覆那些过去在关系数据库中创建
无限分类
的同学的三观的!
用图来解决这种问题, 是不是很Easy!
所以, 选择最合适的工具解决特定问题还有: 目前在RDBMS中比较难处理的问题, 都可以在图数据库当中很轻巧的解决.
Neo4j 把数据存储为节点和关系, 属性以键值对的形式存储, 并连接到节点或者关系. 关系连接两个节点, 并且关系是有类型和方向的.
关系可以双向遍历. 关系类型是通过名称来标识的.
数据模型
把分类
建模为节点, 有公共的属性: {id: 1, name: "名称"}
.
如果我们需要跟踪节点的生命周期, 还可以在节点上增加created_at
,updated_at
,deleted_at
等属性.
创建分类根和唯一约束
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: "分类根"})
, 将会抛出下面的错误:
添加子分类
CREATE (:category {id: 2, name: "食品"})
CREATE (:category {id: 3, name: "出版物"})
CREATE (:category {id: 4, name: "服装"})
创建关系
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)
// 获取分类树的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")
依赖和工具
- 本文使用 Neo4j Desktop
- 需要安装APOC插件
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。