麻煩建立一個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")