北京儿童插座价格联盟

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

只看楼主 收藏 回复
  • - -
楼主


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

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

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

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

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

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

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

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

(5)其他....

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

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

什么是Cypher?

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

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

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

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

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

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

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

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

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

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

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

Indexes(索引)

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

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

Constraints(约束)

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

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


有什么问题可以扫码关注微信公众号:我是攻城师(woshigcs),在后台留言咨询。 
技术债不能欠,健康债更不能欠, 求道之路,与君同行。 



举报 | 1楼 回复

友情链接