如何使用neo4j存储树形无限级菜单

对于树形菜单,想必大家都不陌生,这种业务数据,由于量小,关系复杂,所以在关系型数据库中,存储的格式一般都如下所是:

  1. id,name,pid
  2. 01,bigdata,00
  3. 002,hadoop,01
  4. 003,spark,01
  5. 02,search,01
  6. 03,lucene,02
  7. 04,es,02

有没有人感到困惑,为啥不使用,主外键表,存储这种数据,而非得只使用一张表来存储呢?结果导致查询非常受限,通常只能递归出所有节点,然后对比找到指定数据。

如果使用主外键表存储,通常关系越复杂需要的外键表越多,假如你有8层关系,意味着你需要join到8个外键表,才能获取一条完整数据,这样一比,大多数时候,还是将这种数据,存储在一个表中,然后通过父字段进行找到上一级,当然这种场景下,通常数据量都不会太大,因为递归时间和数据量成正比。

那么当数据量超级大时,应该怎么设计才能支持各种各样的查询,也能提供良好的性能呢?

这个时候用关系型数据库存储肯定不行,超过几十万的数据,递归都需要十几或者几十秒的遍历时间,这样的性能是远远不达标的。

而图形数据库的出现,则是解决这个问题的神器,图形数据库就是为了存储超级复杂的依赖关系和提供高效的查询性能而应劫而生的,比如社交网络,知识图谱,地图最优路径等等。

当然树形菜单的数据,也可以存储在neo4j里面,从而提供强大的查询分析功能,neo4j的小数据下的例子与xmind的思维导图非常类似,都有着一图胜万语强大表现能力。

比如存储从小学到高中的课程里面的章节关系和知识点,如果我们用关系型数据库存储, 提供的分析查询能力非常有限,只能查某个确定节点的父节点,如果想找具体的任意一个节点需要递归遍历所有数据,或者想查某一个科目下,包含知识点路径最长的是哪个,等等就比较复杂了。

图形数据库里面描述数据,是通过节点和关系来描述的,关系必须有开始节点和结束节点 ,节点和关系都可以有属性。

下面说下将树形菜单,存储到neo4j的思路:

(1)递归的每行数据是一个节点,首先插入所有的节点

(2)找到每个节点的父节点做为start节点,本身作为end节点,建立起关系

上面的两个步骤既可以分开执行,也可以单独执行,具体可以参考使用neo4j的api。

导入完的几个效果图如下:(注意这里限制深度了,不限制这个图密度可能非常大)

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2016-10-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Java中的ReentrantLock和synchronized两种锁机制的对比

原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什...

2405
来自专栏包子铺里聊IT

刷题外传之深入浅出 RPC

无论是 Leetcode 和层出不穷的 Online Judge, 核心是帮助大家锻炼 Coding 和解算法题的能力。 刷题非常有用,如刷题时代的困局所述,未...

30810
来自专栏牛客网

C++后台腾讯WXG实习面经(已拿offer)

时间:2018年4月16日 岗位:C/C++后台开发(Linux) BG:WXG 关于我:本科大三 预计2019年毕业 一面(普通技术面) 过程:递交简历 ->...

78310
来自专栏极客生活

从计算机体系结构到高性能编程实践(一)

上来先推荐一本书,《计算机体系结构:量化研究方法(第五版)》,英文能力比较好的建议阅读原版。

1152
来自专栏牛客网

前端一面 - 阿里

13.算法题:电脑里有很多大小不一样的照片,我现在要复制到U盘上,但是U盘容量固定。让你写一个程序,挑选一组照片,让U盘的剩余空间最小。

1142
来自专栏Ceph对象存储方案

对象存储基础概念

对象存储诞生之初 谈到为什么要有对象存储,必须聊聊对象存储诞生之前的两大存储模型:块存储和文件存储。 块存储主要是将存储介质的空间整个映射给主机使用的,主机如果...

6364
来自专栏吉浦迅科技

DAY25: 阅读硬件的多线程

1274
来自专栏企鹅号快讯

反编译对于黑客技术的帮助有多大

目前很多技术都被涉及了,也有很多的技术被挖掘出来,但是很多人对技术不是这么了解的,可能会吃亏,比如说目前挺火的黑客技术还有反编译技术都是属于很多了解却不是这么熟...

38311
来自专栏木子昭的博客

Python3好用的原生api

对列表进行反序是一个很常见的操作, 但python反向切片的玩法实在是非常简洁, 让人无法拒绝, 其实对某一数据结构进行"反向"是一个很有意...

891
来自专栏linux驱动个人学习

SPI通讯协议

一、SPI概述 SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通...

4327

扫码关注云+社区

领取腾讯云代金券