很多人听说过知识图谱,但是对于如何去构建它,还是一头雾水。
知识图谱的构建主要分为两个部分,第一步是知识抽取,第二步是图谱的展示。知识的抽取需要经过复杂的工程化处理,不适合初学者。图谱的展示更形象,更有趣。所以我们将从展示知识图谱会用到的图数据库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。
这两种语言有什么异同点呢?我们看一下它们的对比。
节点对应图上面一个个的小圈圈,它是一个实体。人名,车名,桌椅,一切都可以做成节点。节点的标签表明它归属于哪个节点类。
关系对应图上的线,它由三元组构成:(节点A,关系,节点B)。关系也有自己的标签,标签表明它归属于哪个关系类。
标签就相当于SQL中表的概念,如果我们match某个标签,那返回的就是这个标签下所有的节点,跟我们用SQL去查某张表是一个道理。
既然标签就相当于表,如果它是表,就应该有自己的表字段,所以节点或者关系的属性值,就相当于表字段。
当你理解了CQL与SQL的概念对应关系之后,就可以玩起Neo4j了。
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是不是很简单?下一篇,我们将端到端地讲解如何构建知识图谱。