知识图谱系列一
什么是知识图谱
从学术的角度,知识图谱的定义是:“语义网络(Semantic Network)的知识库”。实际应用的角度出发来说,可以把知识图谱理解成多关系图(Multi-relational Graph)。知识图谱是属于人工智能领域,知识工程下的一个方向。
什么是图
图(Graph)的定义:由节点(Vertex)和边(Edge)来构成,多关系图一般包含多种类型的节点和多种类型的边。
实体(节点)指的是现实世界中的事物比如人、地名、概念、药物、公司等,关系(边)则用来表达不同实体之间的某种联系,比如人-“居住在”-北京、张三和李四是“朋友”、逻辑回归是深度学习的“先导知识”等等
什么是schema
这是属于知识图谱的一个概念,意思为限定待加入知识图谱数据的格式,相当于某个领域内的数据模型。
如何构建知识图谱
数据来源
知识图谱构建的前提是需要把数据从不同的数据源中抽取出来,第一种是业务本身的数据,已经结构化的。第二种是网络上公开、抓取的数据,这是非结构化的,需要再次提取处结构化信息。第二种也是信息抽取的一个难点。
构建知识图谱所涉及的技术
- 实体命名识别(Name Entity Recognition)
- 从文本里提取出实体并对每个实体做分类/打标签
- 关系抽取(Relation Extraction)
- 把实体间的关系从文本中提取出来
- 实体统一(Entity Resolution)
- 有些实体写法上不一样,但其实是指向同一个实体
- 指代消解(Coreference Resolution)
- 文本中出现的“it”, “he”, “she”这些词到底指向哪个实体
知识图谱的存储
一种是基于RDF的存储,另一种是基于图数据库的存储。
neo4j实战
官网下载,免费版即可,我是Mac电脑,直接运行
bin/neo4j start
可以在terminal中看到
Starting Neo4j.
Started neo4j (pid 1149). It is available at http://localhost:7474/
登陆相应的localhost网站即可开始使用。
使用的交互感觉跟jupyter notebook有相似之处。
创建节点
CREATE (n:Person {name:'John'}) RETURN n
注:
CREATE是创建操作,Person是标签,代表节点的类型。
花括号{}代表节点的属性,属性类似Python的字典。
这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是John。
创建关系
MATCH (a:Person {name:'Sally'}),
(b:Person {name:'Steve'})
MERGE (a)-[:FRIENDS]->(b)
注:
方括号[]即为关系,FRIENDS为关系的类型。
注意这里的箭头–>是有方向的,表示是从a到b的关系。 这样,Sally和Steve之间建立了FRIENDS关系。
查询
MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b
查询下所有在Boston出生的人物
删除和修改
MATCH (a:Person {name:'Liz'}) SET a.age=34
修改节点属性
MATCH (a:Person {name:'Mike'}) REMOVE a.test
删除节点属性
可视化
通过database information,点击可生成可视化图片。
当然,我们也可以建立一些更复杂的关系。
查询返回结果也可以是图片。
通过Python操作neo4j
neo4j模块
执行CQL ( cypher ) 语句.
- CQL类似SQL,适合于开发者以及在数据库上做点对点模式(ad-hoc)查询的专业操作人员
- 可以创建、更新、删除节点和关系
- 可以通过模式匹配来查询和修改节点和关系 - 管理索引和约束等
py2neo模块
通过操作python变量,达到操作neo4j的目的。个人比较推荐这种写法。
pip install py2neo,可以适当考虑科学 上网。
# step 1:导包
from py2neo import Graph, Node, Relationship
# step 2:构建图
g = Graph()
# step 3:创建节点
tx = g.begin()
a = Node("Person", name="Alice")
tx.create(a)
b = Node("Person", name="Bob")
# step 4:创建边
ab = Relationship(a, "KNOWS", b)
# step 5:运行
tx.create(ab)
tx.commit()
大规模导入csv
csv格式如下:
# nodes.csv需要指定唯一ID和nam,
headers = [
'unique_id:ID', # 图数据库中节点存储的唯一标识
'name', # 节点展示的名称
'node_type:LABEL', # 节点的类型,比如Person和Location
'property' # 节点的其他属性
]
# relations.csv
headers = [
'unique_id', # 图数据库中关系存储的唯一标识
'begin_node_id:START_ID', # begin_node和end_node的值来自于nodes.csv中节点
'end_node_id:END_ID',
'begin_node_name',
'end_node_name',
'begin_node_type',
'end_node_type',
'relation_type:TYPE', # 关系的类型,比如Friends和Married
'property' # 关系的其他属性
]
制作出两个csv后,通过以下步骤导入neo4j:
- 两个文件nodes.csv ,relas.csv放在neo4j安装绝对路径/import
- 导入到图数据库
mygraph.db neo4j bin/neo4j-admin import --nodes=/var/lib/neo4j/import/nodes.csv --relationships=/var/lib/neo4j/import/relas.csv --delimiter=^ --database=xinfang*.db
- 指定neo4j使用哪个数据库
- 修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
重启neo4j就可以看到数据已经导入成功了