知识图谱构建之一:图数据库Neo4j

来源微信公众号
请关注一下微信公众号:机器学习简明教程

很多人听说过知识图谱,但是对于如何去构建它,还是一头雾水。

知识图谱的构建主要分为两个部分,第一步是知识抽取,第二步是图谱的展示。知识的抽取需要经过复杂的工程化处理,不适合初学者。图谱的展示更形象,更有趣。所以我们将从展示知识图谱会用到的图数据库Neo4j开始,逐步揭开它的面纱。

# 创建节点

    create (aaa:Person { name: "机器学习简明教程", from: "微信公众号", age: 1 })
    create (bbb:Person { name: "深度学习简明教程", from: "微信公众号", age: 0 })
    create (ccc:Author { name: "易山", from: "中国", age: 0 })

​
# 创建公众号节点之间关系

    match (a:Person),(b:Person) 
    where a.name="机器学习简明教程" and b.name= "深度学习简明教程"
    create (a)-[cc:升级版{name:"升级"}]->(b)
    return a,b
    

# 创建作者与公众号关系

    match (a:Author),(b:Person) 
    where a.name="易山" and b.name="深度学习简明教程"
    create (b)-[c:创始人]->(a) return a,b

​
# 创建作者与公众号关系

    match (a:Author),(b:Person) 
    where a.name="易山" and b.name="机器学习简明教程"
    create (b)-[c:创始人]->(a) return a,b

我们通过CQL代码,创建了一个只包含三个节点的知识图谱。有公众号的节点,也有作者节点,有公众号之间的关系,也有作者与公众号之间的关系。

CQL代表Cypher查询语言。像Oracle数据库具有查询语言SQL,Neo4j具有查询语言CQL。

这两种语言有什么异同点呢?我们看一下它们的对比。

01 CQL与SQL的对比

先说不同点:

  • 概念不一样。CQL一个节点对应到SQL就是一条记录,同样一条关系,对应到SQL也是一条记录。CQL的节点和关系都有标签,相当于是SQL中表的概念。一条记录可能存放在A表,也可能存放在B表。因此在CQL中,一个节点或者关系也都会有多个标签。标签有自己的属性,属性的名相当于SQL中的字段名,属性值相当于SQL中的字段的值
  • 关键词不一样。CQL中的return对应SQL中的select,关键词不一样都表示返回满足条件的记录。SQL中的关键词from后跟着表名表示查询的数据来源哪个表,到了CQL中变成match,match后跟着要查找的标签。
  • 语法顺序不一样。CQL的return,create,delete操作都是在最后,而SQL这些操作都是在前面。

相同点:

  • 语法通俗易懂。我们可以对比发现,不管是CQL还是SQL它们的写法都很简单,且人性化、可读性都很高。

02 概念

节点对应图上面一个个的小圈圈,它是一个实体。人名,车名,桌椅,一切都可以做成节点。节点的标签表明它归属于哪个节点类。

关系对应图上的线,它由三元组构成:(节点A,关系,节点B)。关系也有自己的标签,标签表明它归属于哪个关系类。

标签就相当于SQL中表的概念,如果我们match某个标签,那返回的就是这个标签下所有的节点,跟我们用SQL去查某张表是一个道理。

既然标签就相当于表,如果它是表,就应该有自己的表字段,所以节点或者关系的属性值,就相当于表字段。

当你理解了CQL与SQL的概念对应关系之后,就可以玩起Neo4j了。

03 操作

create (aaa:Person { name: "机器学习简明教程", from: "微信公众号", age: 1 })

我们通过create语句创建一个节点,上面的aaa是节点名,跟记录ID是一个意思。可以省略aaa,系统会自动帮你去生成一个节点名。Person是标签名,圆圈的显示属性name的值。

节点用"()“定义,标签用”{}"来定义,属性在标签的括号内。

match (a:Person),(b:Person) 
where a.name="机器学习简明教程" and b.name= "深度学习简明教程"
create (a)-[cc:升级版{name:"升级"}]->(b)
return a,b

基于现有的节点创建关系,必须先定位到节点,然后执行创建操作。

cc是关系名,“升级版”是标签名。

关系用"-[:]->"表示,具有方向性。

match(i:Person) 
where i.name="易山"
return i

查找的语法很简单,先用match定位到是哪种标签,接着通过where约束具体是哪个节点,最后通过return返回这个节点。

图数据库Neo4j是不是很简单?下一篇,我们将端到端地讲解如何构建知识图谱。