图形数据库之Neo4j核心概念介绍(二)

最近这段时间一直在搞知识图谱的一个项目,有点忙,所以博客更新有点慢,现在第一阶段的开发基本完活,后面有空会总结几篇与neo4j有关的文章。

有关neo4j的介绍和使用场景,这里不多说了,不了解的朋友可以参考我之前的文章 http://qindongliang.iteye.com/blog/2327919

我们的使用场景是用来存知识图谱有关的数据简单说就是会把从小学到高中所有的科目的里面的知识点给存储起来,让后建立知识点与知识点之间的依赖关系,从而最终会形成一张复杂的知识网络。举个例子:

比如某个学生,要学习化学里面的某个知识点,但是这个知识点可能与物理有联系,也可能这个知识点与数学也有联系,想要学习和掌握这个知识点,他应该怎么做呢?有了知识图谱网络,就能帮他快速的提供一些有用的信息:

(1)告诉他先学习那几个知识点

(2)告诉他这个知识点有几种途径

(3)告诉他最快的掌握方式是什么

(4)如果掌握了,通过知识点与题目的关联,能给他出一些起到练习巩固的效果

(5)其他....

当然有了图谱数据之后,其实能从里面挖掘出很多其他的信息,当然需要跟具体的业务结合,才能产生的真正的价值。比如北京市的公交站地图或者地铁地图。

言归正传,做项目期间大致看了一遍neo4j官网的文档和它提供的查询语言cypher(英文为翻译的意思)

什么是Cypher?

cypher是neo4j官网的提供的声明式图谱查询语言,用来可视化查询展示图谱里面的节点和关系,围绕图谱查询提供了可读性好和容易使用,功能强大的众多优点。

按照官网的说法,cypher的产生,参考了动态编程语言的一些语法,如Python,ruby,Scala,有非常多的强大的函数库,我们也项目里也用了一些复杂的语法,确实非常强大,不过想要运用自如,确实得花一定时间测试使用才行。

下面介绍下neo4j的几个核心概念:

(1) Nodes(节点,类似地铁图里的一个地铁站)

图谱的基本单位主要是节点和关系,他们都可以包含属性,一个节点就是一行数据,一个关系也是一行数据,里面的属性就是数据库里面的row里面的字段。

除了属性之外,关系和节点还可以有零到多个标签,标签也可以认为是一个特殊分组方式。

(2) Relationships(关系,类似两个相邻地铁站之间路线)

关系的功能是组织和连接节点,一个关系连接2个节点,一个开始节点和一个结束节点。当所有的点被连接起来,就形成了一张图谱,通过关系可以组织节点形成任意的结构,比如list,tree,map,tuple,或者更复杂的结构。关系拥有方向进和出,代表一种指向。

(3) Properties(属性,类似地铁站的名字,位置,大小,进出口数量等)

属性非常类似数据库里面的字段,只有节点和关系可以拥有0到多个属性,属性类型基本和Java的数据类型一致,分为 数值,字符串,布尔,以及其他的一些类型,字段名必须是字符串。

(4) Labels(标签,类似地铁站的属于哪个区)

标签通过形容一种角色或者给节点加上一种类型,一个节点可以有多个类型,通过类型区分一类节点,这样在查询时候可以更加方便和高效,除此之外标签在给属性建立索引或者约束时候也会用到。label名称必须是非空的unicode字符串,另外lables最大标记容量是int的最大值,近似21亿。

(5) Traversal(遍历,类似我们看地图找路径)

查询时候通常是遍历图谱然后找到路径,在遍历时通常会有一个开始节点,然后根据cpyher提供的查询语句,遍历相关路径上的节点和关系,从而得到最终的结果。

(6) Paths(路径,类似从一个地铁站到另一个地铁站的所有的到达路径)

路径是一个或多个节点通过关系连接起来的产物,例如得到图谱查询或者遍历的结果。

(7) Schema(模式,类似存储数据的结构)

neo4j是一个无模式或者less模式的图谱数据库,像mongodb,solr,lucene或者es一样,你可以使用它不需要定义任何schema,

Indexes(索引)

遍历图通过需要大量的随机读写,如果没有索引,则可能意味着每次都是全图扫描,这样效率非常低下,为了获得更好的性能,我们可以在字段属性上构建索引,这样任何查询操作都会使用索引,从而大幅度提升seek性能,

构建索引是一个异步请求,并不会立刻生效,会再后台创建直至成功后,才能最终生效。如果创建失败,可以重建索引,先删除索引,在创建即可,然后从log里面找出创建失败的原因然后分析。

Constraints(约束)

约束可以定义在某个字段上,限制字段值唯一,创建约束会自动创建索引。

至此对neo4j里面的核心概念已经介绍完毕,其实就是实际生活中的例子的抽象,如果还不能理解图数据库,就想一下每个城市的公交图或者地铁图,后面散仙会写一些具体用法的例子。

原文发布于微信公众号 - 我是攻城师(woshigcs)

原文发表时间:2016-10-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术博客

VS2013中Python学习笔记[环境搭建]

Python的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。

17520
来自专栏思考的代码世界

Python网络数据采集之数据清洗|第06天

记得之前我在爬去boss网站的招聘信息的时候,抓取的数据并非我们所理想的样式,后面经过处理后,成为一个自己想要的样子,这个过程可以理解为数据清洗。这里的处理是在...

56270
来自专栏快乐八哥

JavaScript中this关键字使用

在Web开发中,前端掌握JavaScript,后台掌握PHP成为一个趋势。当然后台掌握C#/Java,当然还有Python,Ruby其中的一种,都是可以的。其实...

24890
来自专栏企鹅号快讯

白话C+编程系列之十一 规范篇

上回说到《白话C++编程系列之十: 入口函数篇》 , 我们知道了程序的入口函数通常为main, 就像逛超市, 我们必须得知道它的入口, 才能进去shopping...

24050
来自专栏IT派

那些神奇的一行 Python 代码

Python 这门语言非常的有趣,不仅可以做高大上的人工智能、大数据、机器学习。还可以用来做 Web、爬虫。还有其它很多的应用。今天我就给大家展示下一行 Pyt...

18940
来自专栏Hongten

python开发_python概述

Python(KK 英语发音:/ˈpaɪθən/,是一种面向对象、直译式计算机程序设计语言,

14720
来自专栏企鹅号快讯

编程语言中间令人无语的规则

我们都知道,软件开发人员每天都在做各种各样的决策:如何更好地实现功能、如何修复bug、如何改进应用程序性能等等。但是他们也在其他人的工作成果中继续自己的决定,例...

37750
来自专栏非著名程序员

编程内功心法:如何写代码?

写代码就是学一门语言然后开始撸代码吗?看完了我的《GoF 设计模式》系列文章的同学或者本身已经就是老鸟的同学显然不会这么认为。编程是一项非常严谨的工作!

699130
来自专栏PHP在线

整洁代码之道——重构

写在前面 现在的软件系统开发难度主要在于其复杂度和规模,客户需求也不再像Winston Royce瀑布模型期望那样在系统编码前完成所有的设计满足用户软件需求。...

45160
来自专栏Java面试笔试题

UML中有哪些常用的图?

UML定义了多种图形化的符号来描述软件系统部分或全部的静态结构和动态结构,包括:用例图(use case diagram)、类图(class diagram)、...

10830

扫码关注云+社区

领取腾讯云代金券