知识图谱组队学习笔记 D1-用Windows Neo4j Destop 搭建简易知识图谱

学习时间: 7Days

学习进度:1/7

学习目标:Datawhale 知识图谱组队学习 之 Task 1 知识图谱介绍

什么是知识图谱,Graph,schema

知识图谱:就是语义网络的知识库(Google 2012 -至今)

image-20210111171042871

图(Graph):是由节点(Vertex)和边(Edge)来构成,多关系图一般包含多种类型的节点和多种类型的边。

图的举例:

  • 节点Vertex——表示实体:人名,地名,公司,药物
  • 边Edge——表示关系:朋友,坐落于,子公司,衍生药物

Schema :限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了该领域内有意义的概念类型以及这些类型的属性

Schema的举例:

  • 电影Schema,地方商业Schema

image-20210111171352033

知识图谱的价值

知识图谱是人工智能很重要的一个分支, 人工智能的目标为了让机器具备像人一样理性思考及做事的能力 -> 在符号主义的引领下,知识工程(核心内容即建设专家系统)取得了突破性的进展 -> 在整个知识工程的分支下,知识表示是一个非常重要的任务 -> 而知识图谱又恰恰是知识表示的重要一环

构建知识图谱

数据源:

对于垂直领域的知识图谱,数据来源有2种:

sequenceDiagram
    数据源->>+数据: 业务本身数据(结构化)
    数据源->>+数据: 网络上公开、抓取的数据(非结构化)

信息抽取的难点

难点在于处理非结构化数据,需要自然语言处理

构建知识图谱需要的技术

  1. 实体命名识别(Name Entity Recognition)——NER

    • 提取出“Virgil's BBQ”,并标记实体类型为“Restarant”
    • 提取实体“NYC”,并标记实体类型为 “Location”
  2. 关系抽取(Relation Extraction)——RE

    • 实体“hotel”和“Hilton property”之间的关系为“in”
    • “hotel”和“Time Square”的关系为“near”
  3. 实体统一(Entity Resolution)——ER

    • “NYC”和“New York”指向同一个实体,需要合并
  4. 指代消解(Coreference Resolution)

    • “it”, “he”, “she”这些词指向“hotel”实体

知识图谱的存储

知识图谱主要有两种存储方式:

  • 一种是基于RDF的存储;
  • 另一种是基于图数据库的存储。
区别图数据库RDF
设计原则高效的图查询及图搜索易发布,易共享
存储方式存储三元组(Triple)以图为表现形式
是否包含属性NoYes
Neo4j系统目前仍是使用率最高的图数据库

Neo4j实践

neo4j 是一个图数据库,专门存储图结构, 图的定义

Cypher 是 Neo4J 的声明式图形查询语言,类似于传统数据库的 SQL

Neo4j下载

官网

image-20210111130529791

我在这里下载的是Windows版:Neo4j Desktop

image-20210111130902385

创建图数据库

  1. 创建一个用于练习的图数据库 Exercise Graph Database,点击start开始运行

image-20210111154010355

  1. 然后在浏览器中输入http://127.0.0.1:7474/browser/,进入Web 界面

    • 此时可以进行各项配置、写入、查询等操作,还有可视化功能
    • Web界面最上方是可交互的输入框
  2. 或者点击Neo4j Desktop的Graph Apps,然后再点击Neo4j Browser,也能进入Web界面(我用了这种方法)

简单了解Cypher 查询语言

这里要了解下Neo4j Cypher 查询语言

这个查询语言包含以下几个明显的部分:

  • START:在图中的开始点,通过元素的 ID 或所以查找获得
  • MATCH:图形的匹配模式,束缚于开始点
  • WHERE:过滤条件
  • RETURN:返回所需要的

详细语法可以了解Neo4j 教程 - 5 详解 Cypher 语法

创建节点

  1. 创建一个人物节点:

    image-20210111155652635

    CREATE (n:Person {name:'John'}) RETURN n
  2. 创建更多的人物节点:(此时已经创建了6个任务节点)

      CREATE (n:Person {name:'Sally'}) RETURN n;
      CREATE (n:Person {name:'Steve'}) RETURN n;
      CREATE (n:Person {name:'Mike'}) RETURN n;
      CREATE (n:Person {name:'Liz'}) RETURN n;
      CREATE (n:Person {name:'Shawn'}) RETURN n;
  3. 显示当前的人物节点,可以看到有6个人物(这行代码超常用

    MATCH (n) RETURN n

    image-20210111161120924

  4. 创建6个地区节点(此时有6个人物节点6个地区节点)

      CREATE (n:Location {city:'Miami', state:'FL'})
      CREATE (n:Location {city:'Boston', state:'MA'})
      CREATE (n:Location {city:'Lynn', state:'MA'})
      CREATE (n:Location {city:'Portland', state:'ME'})
      CREATE (n:Location {city:'San Francisco', state:'CA'})

    image-20210111162036575

创建关系

  1. 在朋友之间增加FRIENDS关系(LIz和MIke是个好基友)

    Note:

    MERGE的用法如下:

    • 对不存在的节点创建,存在的节点返回。

      merge (robert:Critic) return robert,labels(robert);

    • 单个属性节点:merge (charlie {name:"Charlie",age:10}) return charlie;
    • 带标签和属性的单个节点:merge (michel:Person {name:"michelDoug"}) return michel;
    • 如果要创建节点就设置属性:merge on create

      merge (keanu:Person {name:"Keanu"}) on create set keanu.created=timestamp() return keanu;

    [] 即为关系,FRIENDS 为关系的类型
    --> 有方向,表示是从 a 到 b 的关系

  MATCH (a:Person {name:'Liz'}), 
        (b:Person {name:'Mike'}) 
  MERGE (a)-[:FRIENDS]->(b)

image-20210111162551572

  1. 给shawn和Sally的FRIEND关系添加属性
  MATCH (a:Person {name:'Shawn'}), 
        (b:Person {name:'Sally'}) 
  MERGE (a)-[:FRIENDS {since:2001}]->(b)
  1. 给更多的好基友添加FRIEND 属性,给结婚的朋友添加MARIED属性
  MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b);
  MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b);
  MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b);
  MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b);

image-20210111164205751

创建出生地关系

  1. 创建人物与出生地之间的关系BORN_IN
  MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b);
  MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b);
  MATCH (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) MERGE (a)-[:BORN_IN {year:1960}]->(b);
  MATCH (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) MERGE (a)-[:BORN_IN {year:1960}]->(b);
  MATCH (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) MERGE (a)-[:BORN_IN {year:1970}]->(b);

image-20210111164514077

TIPS:

同时创建人物节点和FRIEND关系

  CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'}

图数据库查询

  1. 查询下所有在 Boston 出生的人物
  MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b

image-20210111171428868

  1. 查询所有对外有关系的节点
  MATCH (a)--() RETURN a

image-20210111171539295

  1. 查询所有有关系的节点
  MATCH (a)-[r]->() RETURN a.name, type(r)

image-20210111171647532

  1. 查询所有对外有关系的节点,以及关系类型
  MATCH (a)-[r]->() RETURN a.name, type(r)
  1. 查询所有有结婚关系的节点
  MATCH (n)-[:MARRIED]-() RETURN n

image-20210111171753604

  1. 查找某人的朋友的朋友
  MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName

image-20210111171832445

删除和修改

Note:

Set:

  • 用于更新一个节点和关系的标签或属性。

    create (n { name: 'Andres' }) ;

    MATCH (n { name: 'Andres' }) SET n.surname = 'Taylor' RETURN n;

  • 删除属性:MATCH (n { name: 'Andres'}) SET n.name = NULL RETURN n
  • 在节点和关系之间复制属性:MATCH (at { name: 'Andres'}),(pn { name: 'Peter' }) SET at = pn RETURN at, pn;
  • 从 map 添加属性:MATCH (peter { name: 'Peter'}) SET peter += { hungry: TRUE , position: 'Entrepreneur' }
  • 设置多个属性:MATCH (n { name: 'Andres'}) SET n.position = 'Developer', n.surname = 'Taylor'
  • 在节点上加标签: MATCH (n { name: 'Stefan'}) SET n :German RETURN n

    MATCH (n { name: 'Emil' }) SET n :Swedish:Bossman RETURN n

DELETE:

  • 删除节点和关系
  • 删除单个节点:MATCH (n:Useless) DELETE n;
  • 删除节点和连接它的关系:MATCH (n { name: 'Andres'})-[r]-() DELETE n, r
  • 删除所有节点和关系:MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r

REMOVE:

  • 删除标签和属性
  • 删除属性:MATCH (andres { name: 'Andres'}) REMOVE andres.age RETURN andres;
  • 删除节点的标签:MATCH (n { name: 'Peter'}) REMOVE n:German RETURN n;
  • 删除多重标签:MATCH (n { name: 'Peter'}) REMOVE n:German:Swedish RETURN n
  1. 增加 / 修改节点的属性
  MATCH (a:Person {name:'Liz'}) SET a.age=34
  MATCH (a:Person {name:'Shawn'}) SET a.age=32
  MATCH (a:Person {name:'John'}) SET a.age=44
  MATCH (a:Person {name:'Mike'}) SET a.age=25
  1. 删除节点的属性
  MATCH (a:Person {name:'Mike'}) SET a.test='test'
  MATCH (a:Person {name:'Mike'}) REMOVE a.test
  MATCH (a:Location {city:'Portland'}) DELETE a
  MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel

参考文档

  1. Neo4j 教程 - 5 详解 Cypher 语法
  2. 图数据库之 Cypher 语言
  3. Markdown 教程
  4. Neo4J Cypher neo4j-driver py2neo 介绍与使用
  5. Datawhale 知识图谱组队学习 之 Task 1 知识图谱介绍

侠白
1 声望0 粉丝