前言
在学习知识图谱之前,总觉得知识图谱好fancy。你可以搜索到各类知识图谱,菜谱,红楼梦人物关系图谱,哈利波特人物关系图谱。虽然但是,写这篇文章还是因为课程作业要求做这样一个project,那就顺道分享一个从未做过知识图谱的小白完成这样一个知识图谱的步骤。
相信你一步一步跟着这个教程,也能从零到一,自己构建一个知识图谱。
准备工作
工欲善其事,必先利其器。而coding的基础就是配置环境。下面就来简单讲讲如何准备好我们的工具
笔者采用的环境和版本:
Java JDK 15(一定不要用17,和neo4j版本不是很兼容)
Neo4j Community Edition 4.3.6
Py2neo 2021.2.3
下面给出了配置这个几个工具的参考链接,可能版本不一样,配置时配置相应的版本即可。
JDK配置:https://blog.csdn.net/godot06/article/details/104378253
neo4j配置:https://www.jianshu.com/p/27edc7572193
之后在命令行中通过pip install py2neo
中下载py2neo(附官方文档)
或者采用pip install git+https://github.com/technige/py2neo.git@master#egg=py2neo
neo4j的简单运行
既然费尽了千辛万苦下载好了neo4j,那我们当然要好好玩玩啦。
neo4j主要采用的是Cypher Query Language(tutorial),该语言能帮助我们顺利在图数据库中存储和检索数据。
节点、关系、属性、模式
图数据库中,数据一般以如下的关系进行存储:实体-关系-实体,如下图所示。比如下图中Jennifer是一个实体,likes是关系,graphs是实体。Jennifer和graphs之间,通过likes关系相连。而实体在这里称为nodes,我们可以用一个变量(如p
,t
)去表示它。与此同时提出了一个概念叫做node labels,它表明了node的类型。在下图中Company, Person就都是labels,我们采用:label
来表示node label。
下面举一个来自官方教程的小例子,来说明一下该如何在Cypher中去表示
() //anonymous node (no label or variable) can refer to any node in the database
(p:Person) //using variable p and label Person
(:Technology) //no variable, label Technology
(work:Company) //using variable work and label Company
关系的表示则采用-relationship->
和 <-relationship-
表示,其用法如下
//data stored with this direction
CREATE (p:Person)-[:LIKES]->(t:Technology)
//query relationship backwards will not return results
MATCH (p:Person)<-[:LIKES]-(t:Technology)
属性为我们的节点提供了额外的信息 ,比如在图中,名字就是一个属性。属性分为两类:
(1) 节点属性:(p:Person {name: 'Jennifer'})
(2) 关系属性:-[rel:IS_FRIENDS_WITH {since: 2018}]->
模式Pattern则由节点和关系构成,例如Jennifer likes Graphs
(p:Person {name: "Jennifer"})-[rel:LIKES]->(g:Technology {type: "Graphs"})
创建节点和关系
(1)创建节点
CREATE (friend:Person {name: 'Mark'})
RETURN friend //该句可以省略
(2)创建关系
MATCH (jennifer:Person {name: 'Jennifer'})
MATCH (mark:Person {name: 'Mark'})
CREATE (jennifer)-[rel:IS_FRIENDS_WITH]->(mark)
前面两句match是为了找有没有已经存在的节点,避免create会重复创建节点。
(3)更新节点
首先用match找到我们的点,然后用set来设置更新值
MATCH (p:Person {name: 'Jennifer'})
SET p.birthdate = date('1980-01-01')
RETURN p
如何查找
主要采用的结构是match...return...
直接上例子,例如查找里面属性为Person的节点,我们可以这样写
MATCH (p:Person)
RETURN p
LIMIT 1
查找名叫Tom Hanks的人
MATCH (tom:Person {name: 'Tom Hanks'})
RETURN tom
查找Tom Hanks导演的电影
Match (tom:Person {name: 'Tom Hanks'})-[:Directed]->(movie:Movie)
return movie
总结一句,就是按照刚刚我们对节点属性关系的表示方法,向match return中一套就成,要输出啥就return啥。是不是很简单呢!虽然我也记了好多遍才记住。
py2neo的使用
连接neo4j库
在此之前,我们要先在终端运行neo4j start
开启数据库。要是运行不了,请检查环境变量是否正确配置(参考neo4j配置)
from py2neo import Graph
graph = Graph("http://localhost:7474", auth=("neo4j", "password"))
要是没有报错,恭喜你,neo4j已经成功的正常连接起来了。
对数据库进行操作
graph.run("需要运行的cypher语句")
之后,可以用python对数据库进行我们想进行的操作了。