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.底 ...
随机推荐
- 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?
微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- dart 如何优雅的避空
前言 对于每一个程序员来说,空指针异常应该是基本都会遇到过的异常,而且这个异常出现的概率还比较大. 但是,空指针异常又是最容易解决的异常,因为只要加个非空判断就可以避免了. 本篇通过对比一般非空判断和 ...
- Storm入门(十一)Twitter Storm源代码分析之CoordinatedBolt
作者: xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://xumingming.sinaapp.com/811/twitter-stor ...
- Java集合框架详解(全)
一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...
- Python 爬虫——抖音App视频抓包
APP抓包 前面我们了解了一些关于 Python 爬虫的知识,不过都是基于 PC 端浏览器网页中的内容进行爬取.现在手机 App 用的越来越多,而且很多也没有网页端,比如抖音就没有网页版,那么上面的视 ...
- nginx在Centos7.5下源码安装和配置
安装nginx 安装nginx依赖包 yum install -y pcre-devel zlib-devel openssl-devel wget gcc tree vim 进入目录/root/se ...
- Java转PHP的心路历程
首先,我要批评一下自己,已经好久没发博客了.总是拿奇奇怪怪的理由来妨碍自己写博客. emmmm,现在心里舒服一点了. 前提 在2018年的11月7号,我从广州跳槽到一个三线的小城市工作.跳槽原因比较羞 ...
- Android进阶之光-第1章-Android新特性-读书笔记
第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...
- SQL中关于不能显示count为0的行的问题
今天在写自己一个博客项目时遇到了一个数据库问题,因为对于数据库自己所知道的还是很浅显的,对一些查询语句不怎么熟悉. 我目前有一个文章表和评论表,评论表里面有个post_id对应文章表里面的id,想查询 ...
- Struts自动装配和四种放入Session作用域的方式
---恢复内容开始--- Struts三种自动装配的方式 第一种在Action类中定义和表单name相同的成员变量. 首先你定义一个Action类 页面: 第二种把成员变量提取到一个类中, 在Act ...