Neo4j之坑
10个月前,我开始用neo4j做cmdb. 初体验下去neo4j很美好. 但是一年中发现一些问题, 仅仅是个人的体验.经供参考
查询语言
如果接触过Neo4j,都会为Cypher的简单和易用感觉到惊叹, 向其他数据库一样,Neo4j也提供了Explain
和Profile
工具.这样让你容易理解查询是如何运作的.如果你看过neo4j的查询计划优化的图,你会发现一大堆牵扯的线. 最开始简单的查询,一切都很美好.当业务需求越来杂,你用到的查询越来越复杂,你就发现,天啊. 为什么我改了这么一小段代码的顺序,查询慢了这么多. 所以官方也推荐你用多个小查询替代一个大查询. 所以你要迁移部分计算任务到你的代码层,而不是通过Cypher再数据库中帮你处理.
查询的执行过程
查询监视
你有没有过这种情况, 本来你想查100条数据,但是你写错了,你写成查1M条数据. 正常情况下,一般数据库提供query watcher
会阻止你这个查询进行下去,因为这太耗内存,会让数据库都崩了. Neo4j里面也有这个东西,但是好像作用不稳定.最好的结果是你等待了很久得到了一个undefined--undefined
. 更差的是数据库崩了,再差一点,你的服务崩了.
读优先
Neo4j有一个设定,就是任何对Node的操作,都要先把该node的值读出来. 在关系型数据库中,你要删除一个表,是不需要读取每一列的数据的.而在neo4j里面,你要这样做. 所以如果你想要根据label比如Match (n:label) delete n
.那你就要小心了.如果你这个label下有1M的node.那这个任务是无法完成的,因为你的机器RAM不够大.会让JVM GC-FULL. 所以同样,你必须在代码层做一些分块删除处理. 又增加了你的编码难度.
锁
Neo4j的锁行为和关系型数据库不大一样.关系型数据中你做了一个更新操作,那么根据你是乐观/悲观. 或者一些策略,数据库的查询执行器会按照固定的套路进行查询. 在Neo4j中.只有一个写锁.但这个写锁是在真的set
语句开始执行的时候才加上去的. 比如match (n:label {id:1}) set n.param=2
.这句话中只有match执行完了之后才会加上写锁. 这在并发更新的时候就会出现问题. 这在neo4j里面被讨论的很多,很多人也提出了方案
连接
neo4j没有连接池.而且也没有参数限制数据库连接数.很多时候这个问题会导致很多不稳定的情况发生.
扩展
因为用的是Neo4j3.3的版本.没有全文检索的功能.而需求又必须支持比较强大的查询. 所以我需要一个搜索引擎. 我用了ES.但是我并不想在代码层去做neo4j和ES的数据同步. 这样又让我的代码复杂了. 所以我决定用neo4j的插件去做这件事情. neo4j没有像数据库trigger这样的东西.但是可以用transacitonEventhanlder
来实现. 这就有一些问题.
- 缺乏资料, 可能因为我是python程序员的缘故,我对java和kotlin一知半解.
- 事件并不是真的像他说的那样运转.比如
beforeCommit
.这个事件应该发生在数据库未发生变化的时候,这个时候你应该是可以访问被删除的node.但是不是,你访问不了.虽然该事务未提交. 幸好graphware
提供了一系列的插件来支持这些事情.
总结
我没有说Neo4j不能用于生产了,毕竟在它的官网那么多大公司都用了. 但是它至少还有待完善. 经过使用了半年之后.我就决定将数据从neo4j迁出. 只在neo4j中保留全部数据集的子集.用来做一些必要的图搜索算法.
Neo4j之坑的更多相关文章
- Neo4j 爬坑笔记for3.2.6
官网语法,非常详尽:http://neo4j.com/docs/developer-manual/current/cypher/clauses/match/ A:请对应版本号,不同大版本可能会有很大区 ...
- Neo4j填坑记录-Neo4jClient建立节点、建立关系相关
最近一个项目需要用到知识图谱,选用了neo4j图数据库,在这过程中遇到几个坑,记录一下 1.无法登录,疯狂提示“WebSocket connection failure. Due to securit ...
- 踩一踩win7安装neo4j的坑
本文使用zip解压方式安装,下载社区版zip 解压到喜欢的文件夹,然后配置环境变量NEO4J_HOME=D:\neo4j-community-3.5.5(自己的解压目录) 配置Path=%NEO4J_ ...
- neo4j采坑记
1.安装后启动不起来,解决方案: https://stackoverflow.com/questions/38607283/failed-to-start-neo4j-service 2.一直启动不 ...
- 【Neo4j】踩坑大会-Neo4J用中文索引
正在用的Neo4j是当前最新版:3.1.0,各种踩坑.说一下如何在Neo4j 3.1.0中使用中文索引.选用了IKAnalyzer做分词器. 1. 首先参考文章: https://segmentfau ...
- 【图数据库】Neo4j初次部署踩坑
1.从http://we-yun.com/index.php/blog/versions-56.html或者https://neo4j.com/下载neo4j安装包 2.配置NEO4J_HOME变量, ...
- neo4j语法
图数据库在社交网络.实时推荐.征信系统.人工智能等领域有广泛应用. 集群特征:主从复制,重选主服务器和容错:每个实例都有自己的本地缓冲 性能优势:查询内不跨网络:实时操作,具有快速和一致的响应时间:缓 ...
- Neo4j 第一篇:在Windows环境中安装Neo4j
图形数据库(Graph Database)是NoSQL数据库家族中特殊的存在,用于存储丰富的关系数据,Neo4j 是目前最流行的图形数据库,支持完整的事务,在属性图中,图是由顶点(Vertex),边( ...
- neo4j 学习笔记
1.参考 https://blog.csdn.net/appleyk/article/category/7408344 系列文章 (不支持 spring boo 2.0 以下的,入门可做参考) 2.底 ...
随机推荐
- CentOS7中搭建cobbler自动装机服务
一.实验环境 一台centos7 epel源网址 https://fedoraproject.org/wiki/EPEL?rd=Epel 使用nat模式 二.实验步骤 1.下载epel源后进行文件夹挂 ...
- Python基础 列表介绍、使用
第3章 学习目标: 列表是什么以及如何使用列表元素.列表让你能够在一个地方存储成组的信息,其中可以只包含几个元素,也可以包含数百万个元素.列表是新手可直接使用的最强大的Python功能之一,它融合了众 ...
- js动态数字时钟
js动态数字时钟 主要用到知识点: 主要是通过数组的一些方法,如:Array.from() Array.reduce() Array.find() 时间的处理和渲染 js用到面向对象的写法 实现的功能 ...
- 关于Vue.use()使用详解
问题 相信很多人在用Vue使用别人的组件时,会用到 Vue.use() .例如:Vue.use(VueRouter).Vue.use(MintUI).但是用 axios时,就不需要用 Vue.use( ...
- Windows -- cmd命令: ipconfig 和 nbtstat
1. ipconfig 命令格式及参数如下: 2. nbtstat 命令格式及参数如下:
- #001 Python 00号作业:关于课程
请大家继续思考,你希望我们的课程主要涉略哪些方面?你希望我们的课程能够带给你哪些基本的技能?你希望理论课应该怎么上,实验课应该怎么上?对于我们的课程有什么建议或意见 作为一名计算机专业的学生,对于py ...
- 和逛微博、刷朋友圈一样玩转 GitHub
自打毕业之后,可以说每天打开 Github 或Email 看有没有 watch 项目的消息或者自己项目的 issue,然后在Explore 看看社区内项目的走势,紧接着开始写代码搬砖的工作,偶尔也会关 ...
- python爬虫–爬取煎蛋网妹子图片
前几天刚学了python网络编程,书里没什么实践项目,只好到网上找点东西做. 一直对爬虫很好奇,所以不妨从爬虫先入手吧. Python版本:3.6 这是我看的教程:Python - Jack -Cui ...
- ResDrawableImgUtil【根据图片名称获取resID值或者Bitmap对象】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 根据图片名称获取项目的res/drawable-xxdhpi中相应资源的ID值以及bitmap值的封装类. 效果图 代码分析 根据图 ...
- React的入门知识与概念【1】
回顾在以往的项目开发中,从最初的使用的原生html+js+css+jquery开发,到后来随着项目功能的增加,也渐渐学习了Vue.js框架的开发,以及Vue.js的全家桶Axios,Vue-route ...