知识图谱Task01(Datawhale)

知识图谱的定义

学术角度:语义网络(Semantic Network)的知识库

应用角度:多关系图(Multi-relational Graph) ----包含多种类型节点和多种类型边

知识图谱中的重要概念:Schema

用于限定待加入知识图谱数据的格式。

DataType:限定知识图谱节点值的类型

Thing:限定节点的类型及属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-orN6Dnlw-1610418915025)(https://typora-upic-1304199839.cos.ap-shanghai.myqcloud.com/upload/image-20210111213837054.png)]

举例说明:基于上图Schema构建的知识图谱中仅可含作品、地方组织、人物;其中作品的属性为电影与音乐、地方组织的属性为当地的商业(eg:饭店、俱乐部等)、人物的属性为歌手

知识图谱的数据来源

  • 结构化数据:数据库,仅需简单预处理
  • 非结构化数据:网页,需要借助自然语言处理等技术提取结构化信息

例:下图表示从英文文本(非结构化数据)中抽取的实体和关系。

image-20210111214408276

构建知识图谱所涉及的技术

命名实体识别(Name Entity Recognition)

目标:从文本里提取出实体并对每个实体做分类/打标签

举例说明:提取出实体“NYC”,并标记实体类型为 “Location”;我们也可以从中提取出“Virgil’s BBQ”,并标记实体类型为“Restarant”

关系抽取(Relation Extraction)

目标:把实体间的关系从文本中提取出来

举例说明:比如实体“hotel”和“Hilton property”之间的关系为“in”;“hotel”和“Time Square”的关系为“near”等等

实体统一(Entity Resolution)

目的:有些实体写法上不一样,但其实是指向同一个实体,对这些实体进行合并

举例说明:比如“NYC”和“New York”表面上是不同的字符串,但其实指的都是纽约这个城市,需要合并

指代消解(Disambiguation)

目的:还原代词指向的实体

举例说明:文本中出现的“it”, “he”, “she”这些词到底指向哪个实体,比如在本文里两个被标记出来的“it”都指向“hotel”这个实体

知识图谱的存储

  • 基于RDF的存储

存储形式:以三元组形式且不包含属性信息

特点:易于发布和共享

例:Jena

  • 基于图数据库的存储

    存储形式:以属性图为基本的表示形式,所以实体和关系可以包含属性

    特点:高效的图查询和搜索

    例:Neo4j、OrientDB、JanusGraph

image-20210111215749937

Neo4j介绍与安装

Neo4j的安装(Mac)

参照博客https://blog.csdn.net/huacha__/article/details/81123410

Neo4j 3.x 对应 jdk 8.x

Neo4j 4.x 对应 jdk 11.x

登陆本地库时可能会出现下图的问题

image-20210111235815808

输入 用户名:neo4j 密码:neo4j 即可

Web界面使用Neo4j

只有一些简单的查询操作才在web界面中进行,一般还是使用Python等的driver在程序中实现

查询语言:Cypher (CQL)

  • 介绍:声明式图形查询语言,使得用户不必编写图结构的遍历代码,对图形数据实现高效查询
  • 目的:类似SQL,可在数据库上实现点对点模式(ad-hoc)查询
  • 功能:创建、更新、删除节点和关系

Tips:使用web界面创建节点后,要显示所有节点的大图的话,点击左侧Node Labels下的图标即可

用Python操作Neo4j

neo4j模块:执行CQL语句

# step 1:导入 Neo4j 驱动包
  from neo4j import GraphDatabase
  # step 2:连接 Neo4j 图数据库
  driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
  # 添加 关系 函数
  def add_friend(tx, name, friend_name):
      tx.run("MERGE (a:Person {name: $name}) "
            "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
            name=name, friend_name=friend_name)
  # 定义 关系函数
  def print_friends(tx, name):
      for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
                          "RETURN friend.name ORDER BY friend.name", name=name):
          print(record["friend.name"])
  # step 3:运行
  with driver.session() as session:
      session.write_transaction(add_friend, "Arthur", "Guinevere")
      session.write_transaction(add_friend, "Arthur", "Lancelot")
      session.write_transaction(add_friend, "Arthur", "Merlin")
      session.read_transaction(print_friends, "Arthur")

py2neo模块:通过操作python变量,达到操作neo4j的目的

更符合Python的习惯,不需要写CQL

# step 1:导入 Neo4j 驱动包
  from neo4j import GraphDatabase
  # step 2:连接 Neo4j 图数据库
  driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
  # 添加 关系 函数
  def add_friend(tx, name, friend_name):
      tx.run("MERGE (a:Person {name: $name}) "
            "MERGE (a)-[:KNOWS]->(friend:Person {name: $friend_name})",
            name=name, friend_name=friend_name)
  # 定义 关系函数
  def print_friends(tx, name):
      for record in tx.run("MATCH (a:Person)-[:KNOWS]->(friend) WHERE a.name = $name "
                          "RETURN friend.name ORDER BY friend.name", name=name):
          print(record["friend.name"])
  # step 3:运行
  with driver.session() as session:
      session.write_transaction(add_friend, "Arthur", "Guinevere")
      session.write_transaction(add_friend, "Arthur", "Lancelot")
      session.write_transaction(add_friend, "Arthur", "Merlin")
      session.read_transaction(print_friends, "Arthur")

通过csv

需要两个csv文件,分为node.csv和relation.csv

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

delimiter=^ 指的是csv的分隔符

3、指定neo4j使用哪个数据库

  修改 /root/neo4j/conf/neo4j.conf 文件中的 dbms.default_database=mygraph.db

4、重启neo4j就可以看到数据已经导入成功了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值