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.底 ...
随机推荐
- 文件进行MD5计算
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 文本输入框input text输入字母自动转大写
现在需要把一个input输入框内的字母自动转变为大写. 查了下资料,目前收集到的方法有两种: 使用JavaScript,在input标签添加onkeyup方法,将字符转为大写. <input n ...
- Android 插件化技术窥探
在Android 插件化技术中(宿主app和插件app设置相同的sharedUserId),动态加载apk有两种方式: 一种是将资源主题包的apk安装到手机上再读取apk内的资源,这种方式的原理是将宿 ...
- RationalRose 安装过程中无法加载镜像的问题
前情提要:本文主要以提供关键问题的解决思路为目的,境况紧急的,在核对好所遇问题与博主是否一致后,可以直接跳到最后看解决办法即可. 另外,本文重要部分采用不同色文字,加以强调. 任务:安装Rationa ...
- 使用maven生成可执行jar包(包含依赖)
零零散散找了一些文章,有些感觉好乱,自己整理一下 以下是pom.xml里的配置,本来有很多依赖包,为了不让配置看着很长,我删了一些dependencies中我自己项目中引入的jar包 <proj ...
- Go中链路层套接字的实践
1. 介绍 2. 服务端 3. 协议头部 4. 客户端 5. 总结 1. 介绍 接上次的博客,按照约定的划分,还有一层链路层socket.这一层就可以自定义链路层的协议头部(header)了,下面是目 ...
- JVM 学习(二)Java 内存模型、方法内联、逃逸 --- 2019年4月
1.Java 的内存模型 定义了 happens-before,如果同一个线程中,字节码的先后顺序,后者观测了前者的运行结果,那么就会按顺序执行. Java 线程之间的通信由 Java 内存模型控制. ...
- 解决 React-Native mac 运行报错 error Failed to build iOS project. We ran "xcodebuild" command but it exited with error code 65. To debug build logs further, consider building your app with Xcode.app, by ope
React-Native 开发的项目,Android 方面没有任何问题,IOS 就是无法跑起来,报错信息如下: mac 10.14.4 xcode 10.2.1 error Failed to bui ...
- Mybatis之旅第三篇-SqlMapConfig.xml全局配置文件解析
一.前言 刚换工作,为了更快的学习框架和了解业务,基本每天都会加班,导致隔了几天没有进行总结,心里总觉得不安,工作年限越长越感到学习的重要性,坚持下去!!! 经过前两篇的总结,已经基本掌握了mybat ...
- Swagger如何访问Ocelot中带权限验证的API
先亮源代码:https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDe ...