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.底 ...
随机推荐
- Hibernate学习——持久化类的学习
A.概念 持久化:将内存中的对象持久化(存储)到数据库的过程.Hibernate就是持久化的框架. 持久化类:一个普通java对象与数据库的表建立了映射关系,那么这个类在Hiberna中被称为持久化类 ...
- Nodejs实现用户注册
1创建连接池对象 2导出连接池对象 /** * 1.引入mysql模块 * 2.创建连接池对象 * 3.导出连接池对象 */ const mysql = require('mysql'); var p ...
- 一起学Android之Storage
概述 在Android开发中,存储(Storage)的方式根据具体的需求不同而不同,例如数据对应用程序是私有的还是其他应用程序(和用户)可以访问的,以及保存数据需要多大的空间. 存储分类 主要的存储方 ...
- crontab常用
--crontab检查是否安装[oracle@rac1 ~]$ rpm -qa | grep crontabcrontabs-1.10-8启动与关闭[oracle@rac1 ~]$ /etc/init ...
- golang 变量定义
package main import "fmt" var luckyNum = 6 var luckyStr = "love" //myNum := 6 // ...
- pod command
pod 基础使用命令 创建Podfile文件 1 pod init 使用命令打开Podfile文件 1 open -a Xcode Podfile 搜索pod 库 1 pod search 库名 更新 ...
- vue学习笔记2
Vue.js - Day2 品牌管理案例 添加新品牌 删除品牌 根据条件筛选品牌 1.x 版本中的filterBy指令,在2.x中已经被废除: filterBy - 指令 <tr v-for=& ...
- Spring 进入Controller前参数校验
在进入Controller前完成参数的校验,针对对象参数 分为两个验证方式 (1)直接使用已定义的校验方式 1.在需要进行校验的属性上增加校验类型注解 import java.util.Date; i ...
- python爬虫数据解析之BeautifulSoup
BeautifulSoup是一个可以从HTML或者XML文件中提取数据的python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. BeautfulSoup是python爬虫三 ...
- java调用python程序以及向python程序传递参数
在做项目的时候,经常会碰到这个问题,主要程序是用java写的,有些功能使用python写的,整个项目需要把java代码和python代码进行整合,在一个项目里面运行,这就涉及到java调用python ...