在选择数据库的路上,我们遇到过哪些坑?(2)

【编者按】你会怎么选择数据库,是关系数据库、XML 数据库、资源描述框架(RDF),还是图形数据库?本文的第1部分深入而生动地探讨了各种选择。在第2部分,将深入介绍使用 Neo4j 的注意点。文章系国内 ITOM 管理平台 OneAPM 编译呈现。

 

过渡到 Neo4j 之后的经验和教训

下面介绍一些有关运行 Neo4j 的实用技巧:

 

1. 如果你是 Java 商城,请嵌入式地运行 Neo4j

Neo4j 是本地 Java 平台,我们又是 Java 商城,用 Neo4j 相当合适。嵌入 Neo4j 让我们不用再进行 REST 调用,这对于安全来说确实很重要。有关进行 REST 调用的进一步危害,请观看这段有关 REST 安全漏洞的 JavaOne 讨论。

嵌入式地运行 Neo4j 还为我们大幅降低了复杂性。我们可以直接在进程中调用 Neo4j API,从而快速了解 Cypher 语言,以便运行 Cypher 和 Java API 这两者的结合体。同时我们再也不需要托管和非托管的扩展了。

 

2. 摸清自己的优势

摸清自己的优势和所选择的工具的优势,这一点极为重要。用工具来做不适当的事,效果会大打折扣。

本地图形数据库在关系方面的表现确实很好;在图形中找到切入点,然后按照需要深入地研究各种关系,这在 Neo4j 中快得惊人。但如果想要在单个节点之外进行复杂的多值属性全文检索,效果就大打折扣了 —— 但我们选择图形数据库并不是为了做这个。

 

3. 了解查询时会发生哪些事情

了解查询时会发生哪些事情,这一点也极为重要,这能够优化 Cypher 语言。

请看下面这个非常简单的查询。我想要找到 Franklin Country 所有拥有狩猎执照的男性,并且执照上的地址需要和此人的家庭住址相匹配,以便我们确认这是同一个人。

我有一个人员节点,一个执照节点,还有一个位置节点,每个节点上都有各种不同属性:

在选择数据库的路上,我们遇到过哪些坑?(2)

数据库要做的第一件事就是找到切入点(可能有多个切入点),然后图形从切入点展开搜索。寻找切入点通常是个让人头痛的问题。为此要使用带有静态索引集的基于规则的规划程序,这一软件已于近期升级为基于费用。这虽然还不够完美,但无疑已经朝着正确的方向前进了一大步。

 

索引

索引基本上会复制数据库中的信息片段,这样有利于它迅速找到节点。在本例中,只使用信息片段来确定切入点。虽然不是必须要使用索引,但它确实能派上用场。如果要在特定的节点属性上进行检索,在节点上设置一个索引会是个好办法,即使这会占用磁盘空间。

索引分为两种:schema 和 legacy。Schema 索引是最新版,使用内部自定义的 Neo4j 内置索引,目前是默认设置。

一旦利用 Cypher 或 Java API 创建 schema 索引后,这些索引就会自动由数据库维护。例如,如果你想在每个带有“人员”标签和“性别”属性的节点上创建索引,当你创建新节点、更改节点值或删除节点时,数据库将自动对其进行更新。这时你也可以设置限定条件,比如必须存在属性或属性必须是唯一的。

Legacy 索引是 Lucene 索引,是较早的版本但尚未弃用。可以通过配置文件、Neo4j 属性文件、Java API 或 Cypher 来设置 legacy 索引。Legacy 索引使用的是 Lucene 而非 Neo4j 专有索引机制。我们在用 Neo4j 时几乎没有什么漏洞,而每次遇到的漏洞基本都和 legacy 索引有关。即使是这样,有时候这些索引也是必要的。

Apache Luke 是一款非常不错的开源工具,用户可以用它直接查看和搜索 Lucene 索引。这也帮助我们修复了 legacy 索引中的异常行为。

 

自动索引与手动索引

Legacy 索引有两种用法:自动索引和手动索引。我建议使用自动索引,因为它更容易维护。基本上只要设置一次(可以在配置文件中设置也可以通过 API 设置),然后设为在特定类型的节点上为特定类型的属性编写索引。自动索引还能够在必要时轻松重建索引。

但是用户无法指定是哪种类型的索引。在 Lucene 中,schema 存在不同索引类型,例如字符串、区分大小写,以及数值,这些都是物理上独立的索引。

如果你在查询 Lucene 时想要使用这些索引,必须要做的第一件事就是告诉 Lucene 要使用哪个索引。但如果进行自动索引,Neo4j 可以根据你要编写索引的第一个对象来选择使用哪个索引。例如,如果你设置的第一个索引是蓝色,Neo4j 就会明白蓝色是字符串,然后会永久性地将蓝色放在字符串索引中。

如果你能很好地控制收到的数据,这一索引方式效果会很不错。但我们的系统没有这样。我们从许多不同的来源接收数据,所以收到的“blue”(蓝色)属性可能会指年龄。但如果这一属性是最先收到的,Neo4j 就会把年龄作为基于字符串的属性而不是数值属性来编写索引,如此一来,之后就没法按照我希望的方式展开进一步比对和排列了。在这种情况下,只能手动创建索引。

使用自动索引的另一个好处是,如果目录无故损坏,很容易就能修复目录。可以暂停整个数据库,进入 Lucene 索引目录,删除此目录,重启数据库,然后 Neo4j 会为所有节点重新编写索引。但如果已经进行了手动索引,你只能返回,然后为所有节点重新编写索引。

 

范围查询

下面一系列幻灯片显示了范围查询:

在选择数据库的路上,我们遇到过哪些坑?(2)

我想查询“profile”(个人信息),所以我把 PROFILE 放在查询内容的前面。我想找到收入为特定数值(50500)的所有人群并且只返回最前面的两个结果。

这段代码表明,我已经有了某人的收入索引,规划程序的限值是 2。NodeIndexSeek 用这一索引来查找数值,从一个拥有 22 万人的样本数据库中进行了大约 2800 次数据库访问。

在接下来的范围查询中,我准备查找收入低于 50500 的人:

在选择数据库的路上,我们遇到过哪些坑?(2)

在这次的查询中,我们执行了 NodeByLabelScan,由于没有使用索引,我们进行了多达 43 万次数据库访问。在 Neo4j 第 2.3 版之前,schema 索引不支持范围,所以你必须得用 legacy 索引,然后直接查询 Lucene 索引,才能发挥作用。

第 2.3 版修复了这一问题;现在有了 NodeIndexSeekByRange,可在 schema 标签上提供范围索引:

在选择数据库的路上,我们遇到过哪些坑?(2)

 

4. 不要使用内部节点 ID

使用当前节点 ID 是个很大的诱惑,但这种做法非常不可取,这是因为在某些时刻,这种做法会导致数据库内容被删除。请阅读这篇介绍,了解更多相关内容。

Neo4j 使用增量日志。如果你删除了某个节点,最后系统会翻转节点 ID,这样你就可以重复使用这些数字。我们结合使用了节点标签和随机选择的 UUID,这样如果你的 API 始终暴露在外,就可以提供额外的安全保障。

 

5. 数据建模很重要

数据模型的重要程度至少和查询相当。下面的说明很有用:可以通过多重关系类型或关系上的属性来为部分关系建模。两种方法似乎同样合理,但它们的性能表现可能大相径庭。一定要了解一下 GraphAware 对这一内容的介绍。其区别在于,一方定义不同类型的 person 和 place 之间的关系……

在选择数据库的路上,我们遇到过哪些坑?(2)

……而另一方则表示有三种不同的属性类型:

在选择数据库的路上,我们遇到过哪些坑?(2)

性能表现提升了八倍。上述 GraphAware 的文章深入详细地解释了这一概念。

 

6. 优化性能

EXPLAIN 和 PROFILE 绝对是你的良师益友。别担心 Java API,而查询规划程序还很年轻,在许多情况下都比 Cypher 要快。如果你要设定基准,一定要以温备份数据库设定基准。这样就能加载 Neo4j 的数据库缓存。

 

7. 一定要交流!

Neo4j 拥有强大的支持社区,包括谷歌论坛、Slack 协作频道、Stack Overflow 网站和非常出色的支持团队。

 

8. 在工具栏里添加下面的代码

借助下面的样板代码,可以检查数据库中的每个节点并修复所有问题。这一示例有时会抓取关系,但你也可以对节点或其他限定条件进行同样的操作。

不管怎样,它都能事务性地依次通过数据库中的所有节点。在本例中,每个事务是 90000 次操作,如果有需要,还可以批量更改整个数据库:

在选择数据库的路上,我们遇到过哪些坑?(2)

本文系 OneAPM 工程师整理呈现。OneAPM 能为您提供端到端的应用性能解决方案,我们支持所有常见的框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,性能监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。

本文转自 OneAPM 官方博客

原文地址:https://dzone.com/articles/from-good-to-graph-choosing-the-right-database

 

 
Ubuntu开发环境配置——持续更新 本文简要介绍了Ubuntu下的开发环境配置流程和问题分析与解决,更多内容持续更新中。 阅读详情

相关推荐

电力电子课设救星:用Simulink实现Buck变换器双闭环控制(PID调参技巧)

本文是电力电子课程设计的实用指南,详细讲解如何利用Simulink仿真平台实现Buck变换器的电压电流双闭环控制。文章核心聚焦于PID参数整定的实战技巧,提供了从手动调试口诀到MATLAB脚本自动优化的完整方案,旨在帮助学生高效完成课设,深入理解闭环控制原理并生成专业报告。

weixin_29179311的博客 296

在选择数据库的路上,我们遇到过哪些坑?(1)

【编者按】你会怎么选择数据库,是关系数据库、XML 数据库、资源描述框架(RDF),还是图形数据库?这篇演讲深入而生动地探讨了各种选择。本文系国内 ITOM 管理平台 OneAPM 编译呈现。 备注:在去年十月于旧金山举办的 GraphConnect 大会上,FactGem 公司首席技术官 Clark Richey发表了这篇演讲,解释了他...

weixin_34087301的博客 380

UFS 3.1协议实战解析:从MIPI M-PHY到SCSI命令的完整链路拆解

本文深入解析UFS 3.1存储协议,从MIPI M-PHY物理层到SCSI命令层,完整拆解数据链路。通过分析协议栈三层架构(UIC、UTP、UCS),结合Wireshark抓包实战,详解UPIU数据包传输与SCSI命令封装,并探讨GEAR模式对性能与功耗的影响,为嵌入式存储开发与调试提供实用指南。

weixin_29207533的博客 420

记录第一次使用neo4j进行图数据库实验时踩到的一些坑

PyCharm项目迁移时报错:虚拟环境SDK失效 很显然,提供项目文件的那个人没咋用过GitHub(╬▔皿▔)╯我以前在GitHub上见到的python项目都是代码文件+资源文件+requirements.txt,装第三方库的时候直接一句pip install -r requirements.txt就能搞定,它不香吗? 不过没办法,木已成舟,总不能就这么不做了吧。 我的解决方法是这样的:直接运行代码,根据报错信息,我们可以知道缺少哪些库,比方说,如果缺py2neo这个库,那就在venv/lib/site-p

Dan_Kuroto的博客 862

Unity通过Vosk实现离线语音识别方法

以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。

qq_39515892的博客 2070

LabVIEW面向对象编程:操作者框架入门实战

本文是LabVIEW面向对象编程中操作者框架的入门实战指南。针对传统“面条式代码”在复杂项目中的维护难题,文章通过创建操作者、定义消息与处理函数、在主VI中调用等步骤,详细演示了如何利用操作者框架构建模块化、易扩展的应用程序架构,有效管理并行任务。

f0g1h2的博客 589

Cypher笔记(二)

Cypher笔记(二) 1.模式 索引和约束时图的模式,Cypher引入了数据定义语言(Data Definition Language,DDL)来操作模式。 a.索引 索引是为了提高数据检索效率而引入的冗余信息,代价是需要维护额外的数据使得写入时更慢。Cypher允许所有节点的某个属性上有特定的标签。索引一旦创建,它将自己管理并当图发生变化时自动更新。多因创建并生效后,Neo4j...

Luncert的博客 1342

计算机视觉-全景图像拼接中的特征匹配与优化策略

本文深入探讨了计算机视觉中全景图像拼接的核心技术,重点解析了特征匹配后的关键优化策略。通过SIFT特征提取、RANSAC算法剔除误匹配,并结合APAP算法应对视差与鬼影问题,详细阐述了从基础对齐到无缝融合的完整流程,为开发者实现高质量全景拼接提供了实用指南。

weixin_29039773的博客 361

mysql5.0的安装与调试

我们网站的数据库要改为mysql5.0,所以我得在我机器上安装mysql5.0。 安装mysql有两种方法,有安装包的安装法及绿色安装法,使用安装包的安装法我以前已经用过了,基本上就是傻瓜式的安装法,今天我要尝试绿色安装法,在网上搜了教程。 一、下载,这里使用绿色解压缩版  http://mysql.west.mirrors.airband.net/Downloads/MySQL-5.0

lq305的专栏 641

03 - AMDGPU驱动架构概览

本文介绍了AMDGPU驱动的整体架构,重点分析其图形驱动(AMDGPU)和计算驱动(KFD)的双重结构。KFD驱动作为HSA架构的核心组件,包含进程管理、设备管理等模块,其中SVM功能在kfd_svm.c实现。文章详细解析了KFD的核心组件、初始化流程及字符设备接口,并阐述了TTM框架在GPU内存管理中的作用。通过架构图和代码片段展示了AMDGPU与KFD的协作机制,为后续深入理解SVM实现奠定基础。

图形/计算GPU的驱动与虚拟化技术分享园地 3367

c++对halcon的动态链接库dll封装及调用(细细讲)

本文详细介绍了将Halcon图像处理算法封装为C++动态链接库(DLL)的完整流程,包括7个关键步骤:1)封装Halcon函数并导出CPP文件;2)在C++项目中配置Halcon环境(包含目录、库目录设置);3)验证Halcon代码;4)创建DLL项目并进行环境配置;5)编辑DLL并导出生成文件(.dll、.lib、.h);6)在主项目中配置DLL调用环境;7)编写测试代码验证功能。通过这个流程实现了Halcon算法的模块化封装和复用,文中提供了具体的配置路径和代码示例,重点说明了环境配置细节和文件结构安排

Tianwen_running的博客 966

Chat2DB+cpolar组合突破物理限制,成为数据库查询新解

说了这么多,你是不是觉得Chat2DB只能在本地使用?太out啦!有了cpolar,你就可以随时随地远程访问Chat2DB啦!什么是cpolar?cpolar是一款简单易用的内网穿透工具,它可以将你的本地服务暴露到公网,让你可以从任何地方访问你的本地服务。访问cpolar官网:点击免费使用注册一个账号,并下载最新版本的Cpolar。登录成功后,点击下载Cpolar到本地并安装(一路默认安装即可)本教程选择下载Windows版本。

LucianaiB的博客 6万+

【AutoSAR】【以太网】TCP/IP 栈详述与配置

目录 一、TCP/IP栈架构 二、TCP\IP栈的可扩展性 三、以太网协议V4 四、以太网协议 V6 五、基于IP的协议 六、函数调用序列图 一、TCP/IP栈架构 根据以上架构图,该栈主要包括:UPD\TCP\DHCP\ICMP\IPV4\IPV6\ARP; 二、TCP\IP栈的可扩展性 TCP\IP栈为适应不同的应用场景需求,将分为三类: 配置工程里的配置项: 三、以太网协议V4 1 IPV4 Internet Protocol (IP)是T.

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 5695

【AI数据库Chat2DB】数据查询零门槛新解!Chat2DB让数据库操作突破物理限制

【AI数据库Chat2DB】数据查询零门槛新解!Chat2DB让数据库操作突破物理限制

学习笔记 1348

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

换7dB天线到底有用吗?

淘宝上有很多7dB天线。不知道有没有用?到底应该买哪一种?搜索淘宝时可以用关键词                   7dB  天线      然后排列价格。我的想法: 似乎时说放到同一平面上效果才更好。 有的标称很好的天线,效果一般。所以目前的想法是:找个焊接的地方,把断的地方焊好。刚才:焊接好了。但是焊接的很难看,而且不能转头了(焊死了)。但是信号基本没有改变。

thinkweird的专栏 4102

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从物理转AI、战数据库,95后程序员的职业选择

希望能给职业成长路上有些许迷茫与困惑的年轻程序员们一点启发。

《程序员》官方BLOG 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

10年Oracle运维转战国产数据库:迁移路上的“坑”与“光”

在Oracle中,自定义函数的返回值类型可以是VARCHAR2NUMBER等,但是在金仓中,自定义函数的返回值类型需要使用VARCHARINTEGER等。我当时迁移的时候没注意这个问题,导致很多自定义函数都执行失败了。

程序边界 1万+

【数据库】大模型时代的数据库新范式:从平替到智能演进

KingbaseES V8R6 环境实测,数据来源自电科金仓数据库 2024 年技术白皮书与企业解决方案,确保专业可信。

杰西笔记 8358

数据仓库之DIM层

一、属性与度量 在介绍维表之前,我们首先要明白一点属性与度量的区别。属性是指是对象的性质或特性,它因对象而异,或随时间而变化,比如姓名和年龄。姓名因人而异,年龄会不断变化。而度量是对属性的标量刻画。并且度量具有统计意义,而属性并不具有统计意义,比如25岁的我在超市买了1瓶300ML农夫山泉,花了2元。这里的1瓶和2块就是对我买水的这个业务过程的度量。超市是(地理维度)属性,25岁是描述实体的属性,300ML是描述农夫山泉的属性。所以我们可以通过2个点来区分属性和度量,1.是否具有统计意义,2.是否会随..

jianghuaijie的博客 8130
上一篇: 在选择数据库的路上,我们遇到过哪些坑?(1)
下一篇: 2016年度最受欢迎的100个 Java 库
OneAPMOfficial
博客等级 码龄11年 5粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值