知识图谱系列一

什么是知识图谱

从学术的角度,知识图谱的定义是:“语义网络(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:

  1. 两个文件nodes.csv ,relas.csv放在neo4j安装绝对路径/import
  2. 导入到图数据库
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
  1. 指定neo4j使用哪个数据库
  2. 修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db
    重启neo4j就可以看到数据已经导入成功了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值