如何用图数据库构建知识图谱?
您目前处于:AI&大模型  2024-08-01

系列文章:

• 如何用图数据库构建知识图谱?

• Neo4j 之 Cypher 学习

• Gremlin 语法入门


一、知识图谱的定义

知识图谱是以图数据库为基础,基于数据库技术,在知识获取、知识存储和知识管理等方面的一种应用,将现实世界中的实体及其属性关系以图谱化的形式表示出来。知识图谱是对人类已有的知识进行系统性加工和系统化处理后,构建出能够承载各种信息的图形结构,以反映其内在联系及相互关系,并可进行推理、查询和应用。

知识图谱具有丰富的语义信息,可以支持智能问答、搜索、推荐等应用,是一种新型的智能信息检索与分析技术。目前已经广泛应用于科学研究、大数据分析、智能搜索、智能推荐等领域。图数据库作为一种新型的数据库,也是构建知识图谱的主要选择之一。

在图数据库中构建知识图谱的步骤如下

  • 1、在图数据库中创建实体、属性和关系,并以实体为顶点,属性为边(实体-属性)的方式创建关系。

  • 2、通过添加和删除节点或边来丰富知识图谱。

  • 3、通过指定实体标识(NER)算法,识别出知识图谱中的实体以及这些实体之间的关系。

二、图查询语言:Gremlin vs Cypher

Neo4j 的早期历史

Neo4j 和属性图这种数据模型,最早构想于 2000 年。Neo4j 的创始人们当时在开发一个媒体管理系统,所使用的数据库的 schema 经常会发生重大变化。为了支持这种灵活性,Neo4j 的联合创始人 Peter Neubauer,受 Informix Cocoon 的启发,希望将系统建模为一些概念相互连接的网络。印度理工学院孟买分校的一群研究生们实现了最早的原型。Neo4j 的联合创始人 Emil Eifrém 和这些学生们花了一周的时间,将 Peter 最初的想法扩展成为这样一个模型:节点通过关系连接,key-value 作为节点和关系的属性。这群人开发了一个 Java API 来和这种数据模型交互,并在关系型数据库之上实现了一个抽象层。

虽然这种网络模型极大的提高了生产力,但是性能一直很差。所以 Neo4j 联合创始人 Johan Svensson 花精力,为这种网络模型实现了一个原生的数据管理系统。这个就成为了 Neo4j。 在最初的几年,Neo4j 作为一个内部产品很成功。在 2007 年,Neo4j 的知识产权转移给了一家独立的数据库公司。

Neo4j 的第一个公开发行版中,数据模型由节点和有类型的边构成,节点和边都有 key-value 组成的属性。Neo4j 的早期版本没有任何的索引,应用程序只能从根节点开始自己构造查询结构(search structure)。因为这样对于应用程序非常笨重,Neo4j 2.0(2013 年 12 月发布)引入了一个新概念——点上的标签(label)。基于点标签,Neo4j 可以为一些预定义的节点属性建立索引。

节点、关系、属性、关系只能有一个标签、节点可以有零个或者多个标签,以上这些构成了 Neo4j 属性图的数据模型定义。后来增加的索引功能,让 Cypher 成为了与 Neo4j 交互的主要方式。因为这样应用开发者只需要关注于数据本身,而不是上段提到的那个开发者自己构建的查询结构(search structure)。

Gremlin 的创造

最初与 Neo4j 的查询方式是通过 Java API。应用程序可以将查询引擎作为库嵌入到应用程序中,然后使用 API 查询图。如果是自定义查询引擎,然后应用程序远程访问服务器,这样就比较困难。

就在这段时间,NOSQL 这个概念开始出现。NOSQL 型的数据库引擎一般用 REST 和 HTTP 来交互和查询。Neo4j 的早期员工 Tobias Lindaaker(和 Ivarsson)考虑用 HTTP 的方式访问 Neo4j 会是一种更好的办法。他们观察到很多的查询语句可以表达为:图到树的投影映射(projection)。典型的,从根节点开始遍历一个扩张树(spanning tree),然后返回叶子节点。基于这样的观察,并参考一些树结构的查询语句,比如 XPath,也许可以作为一种图的查询方式。而且,XPath 的语法和一般 URI 的语法很像。这样 XPath 查询可以很自然的作为 HTTP GET 中 URI 的一部分。Neo4j 的联合创始人 Peter Neubauer 喜欢这个想法,找了一个朋友 Marko Rodriguez 来干。两天后,Marko 做了一个原型,用 XPath 作为图查询,Groovy 提供循环结构,分支,和计算。 这个就是 Gremlin 最初的原型。 2009 年 11 月发布了第一个版本。

后来,Marko 发现同时用两种不同的解析器(XPath和Groovy)有很多问题,就将 Gremlin 改为基于 Groovy 的一种内置的领域特定语言(DSL)。

Cypher 的创造

Gremlin 和 Neo4j 的 Java API 一样,最初用于表达如何查询数据库的一种过程(Procedural)。它允许更短的语法来表达查询,也允许通过网络远程访问数据库。Gremlin 这种过程式的特性,需要用户知道如何采用最好的办法查询结果,这样对于应用程序开发人员来说仍旧有负担。基于声明式语言 SQL 的成功:SQL 可以将获取数据的声明方式和引擎如何获取数据分开,Neo4j 的工程师们希望开发一种声明式的图查询语言。

2010 年,Andrés Taylor 作为工程师加入 Neo4j,在此之前他是 SQL DBA。他开始了一个项目,受 SQL 启发,其目标是开发图查询语言,而这种新语言 Cypher 于 2011 年 Neo4j 1.4 发布。

Cypher 的语法基础,是用 "ascii 艺术(ascii art)" 来描述图模式。这种方式最初来源于 Neo4j 工程师团队在源代码中评注如何描述图模式。可以看下图的例子:

Cypher 第一个版本实现了对图的读取,但是需要用户说明从哪些节点开始查询。只有从这些节点开始,才可以支持图的模式匹配。

在后面的版本,2012 年 10 月发布的 Neo4j 1.8 中,Cypher 增加了修改图的能力。但查询还是需要指明从哪些节点开始。

2013 年 12 月,Neo4j 2.0 引入了 label 的概念,label 本质上是个索引。这样,查询引擎就可以利用索引,来选择模式所匹配到的节点,而不需要用户指定开始查询的节点。

随着 Neo4j 的普及,Cypher 有着广泛的开发者群体 ,和各行各业的使用。

openCypher - 一种推进和标准化Cypher的开源过程

2015 年 9 月,Neo4j 开放了 Cypher 查询语言,通过开源的方式来治理。这个新主体的治理主体是 openCypher Implementors Group(oCIG)。

2016 年,openCypher 项目发布 EBNF 和 ANTLR4 ,Neo4j 也贡献了很多基于 Apache 2.0 的语言功能测试集(openCypher Technology Compatibility Kit, TCK)。将这些作为语言标准定义,任何人都可以为该语言提交新的提议。2016 年,SAP HANA Graph 发布了基于 Cypher 的查询部分的实现,Agens Graph 和 Redis Graph 在 2017 年支持了 Cypher。2017 年 oCIG 也进行了一系列线上线下的会议,讨论语言功能扩展等。

oCIG 发布 openCypher,采用英语语言作为规范,对应了 Neo4j 3.3.0 版本中的 Cypher。


引用:

https://zhuanlan.zhihu.com/p/365370458


转载请并标注: “本文转载自 linkedkeeper.com (文/然行)”  ©著作权归作者所有