共计 5281 个字符,预计需要花费 14 分钟才能阅读完成。
常识图谱组队学习笔记 D1- 用 Windows Neo4j Destop 搭建繁难常识图谱
学习工夫:7Days
学习进度:1/7
学习指标:Datawhale 常识图谱组队学习 之 Task 1 常识图谱介绍
什么是常识图谱,Graph,schema
常识图谱:就是语义网络的知识库(Google 2012 - 至今)
图(Graph):是由节点(Vertex)和边(Edge)来形成,多关系图个别蕴含多种类型的节点和多种类型的边。
图的举例:
- 节点 Vertex——示意实体:人名,地名,公司,药物
- 边 Edge——示意关系:敌人,坐落于,子公司,衍生药物
Schema:限定待退出常识图谱数据的格局;相当于某个畛域内的数据模型,蕴含了该畛域内有意义的概念类型以及这些类型的属性
Schema 的举例:
- 电影 Schema,中央商业 Schema
常识图谱的价值
常识图谱是人工智能很重要的一个分支, 人工智能的指标为了让机器具备像人一样感性思考及做事的能力 -> 在符号主义的引领下,常识工程(核心内容即建设专家系统)获得了突破性的停顿 -> 在整个常识工程的分支下,常识示意是一个十分重要的工作 -> 而常识图谱又恰好是常识示意的重要一环
构建常识图谱
数据源:
对于垂直畛域的常识图谱,数据起源有 2 种:
sequenceDiagram
数据源 ->>+ 数据: 业务自身数据(结构化)数据源 ->>+ 数据: 网络上公开、抓取的数据(非结构化)
信息抽取的难点
难点在于 解决非结构化数据,须要自然语言解决
构建常识图谱须要的技术
-
实体命名辨认(Name Entity Recognition)——NER
- 提取出“Virgil’s BBQ”,并标记实体类型为“Restarant”
- 提取实体“NYC”,并标记实体类型为“Location”
-
关系抽取(Relation Extraction)——RE
- 实体“hotel”和“Hilton property”之间的关系为“in”
- “hotel”和“Time Square”的关系为“near”
-
实体对立(Entity Resolution)——ER
- “NYC”和“New York”指向同一个实体,须要合并
-
指代消解(Coreference Resolution)
- “it”,“he”,“she”这些词指向“hotel”实体
常识图谱的存储
常识图谱次要有两种存储形式:
- 一种是基于 RDF 的存储;
- 另一种是基于图数据库的存储。
区别 | 图数据库 | RDF |
---|---|---|
设计准则 | 高效的图查问及图搜寻 | 易公布,易共享 |
存储形式 | 存储三元组(Triple) | 以图为表现形式 |
是否蕴含属性 | No | Yes |
Neo4j 零碎目前仍是使用率最高的图数据库
Neo4j 实际
neo4j 是一个图数据库,专门存储图构造,图的定义
Cypher 是 Neo4J 的申明式图形查询语言,相似于传统数据库的
SQL
Neo4j 下载
官网
我在这里下载的是 Windows 版:Neo4j Desktop
创立图数据库
- 创立一个用于练习的图数据库 Exercise Graph Database,点击 start 开始运行
-
而后在浏览器中输出 http://127.0.0.1:7474/browser/,进入 Web 界面
- 此时能够进行各项配置、写入、查问等操作,还有可视化性能
- Web 界面最上方是可交互的输入框
- 或者点击 Neo4j Desktop 的 Graph Apps,而后再点击 Neo4j Browser,也能进入 Web 界面(我用了这种办法)
简略理解 Cypher 查询语言
这里要理解下 Neo4j Cypher 查询语言
这个查询语言蕴含以下几个显著的局部:
- START:在图中的开始点,通过元素的 ID 或所以查找取得
- MATCH:图形的匹配模式,解放于开始点
- WHERE:过滤条件
- RETURN:返回所须要的
具体语法能够理解 Neo4j 教程 – 5 详解 Cypher 语法
创立节点
-
创立一个人物节点:
CREATE (n:Person {name:'John'}) RETURN n
-
创立更多的人物节点:(此时曾经创立了 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;
-
显示以后的人物节点,能够看到有 6 个人物(这行代码超罕用)
MATCH (n) RETURN n
-
创立 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'})
创立关系
-
在敌人之间减少
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)
- 给 shawn 和 Sally 的
FRIEND
关系增加属性
MATCH (a:Person {name:'Shawn'}),
(b:Person {name:'Sally'})
MERGE (a)-[:FRIENDS {since:2001}]->(b)
- 给更多的好基友增加
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);
创立出生地关系
- 创立人物与出生地之间的关系
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);
TIPS:
同时创立人物节点和
FRIEND
关系CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'}
图数据库查问
- 查问下所有在 Boston 出世的人物
MATCH (a:Person)-[:BORN_IN]->(b:Location {city:'Boston'}) RETURN a,b
- 查问所有对外有关系的节点
MATCH (a)--() RETURN a
- 查问所有有关系的节点
MATCH (a)-[r]->() RETURN a.name, type(r)
- 查问所有对外有关系的节点,以及关系类型
MATCH (a)-[r]->() RETURN a.name, type(r)
- 查问所有有结婚关系的节点
MATCH (n)-[:MARRIED]-() RETURN n
- 查找某人的敌人的敌人
MATCH (a:Person {name:'Mike'})-[r1:FRIENDS]-()-[r2:FRIENDS]-(friend_of_a_friend) RETURN friend_of_a_friend.name AS fofName
删除和批改
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
- 减少 / 批改节点的属性
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
- 删除节点的属性
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
参考文档
- Neo4j 教程 – 5 详解 Cypher 语法
- 图数据库之 Cypher 语言
- Markdown 教程
- Neo4J Cypher neo4j-driver py2neo 介绍与应用
- Datawhale 常识图谱组队学习 之 Task 1 常识图谱介绍