当前位置:   article > 正文

知识图谱task1_知识图谱 开源

知识图谱 开源

知识图谱是由 Google 公司在 2012 年提出来的一个新的概念。从学术的角度,我们可以对知识图谱给一个这样的定义:“知识图谱本质上是语义网络(Semantic Network)的知识库”。

 

目录

 

1.知识图谱的重要概念

  • Graph:图(Graph)是由节点(Vertex)和边(Edge)来构成。多关系图一般包含多种类型的节点和多种类型的边。实体(节点)指的是现实世界中的事物比如人、地名、概念、药物、公司等,关系(边)则用来表达不同实体之间的某种联系。在这里插入图片描述

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

2.如何构建知识图谱

  • 实体命名识别(Name Entity Recognition):就是从文本里提取出实体并对每个实体做分类/打标签
  • 关系抽取(Relation Extraction):通过关系抽取技术,把实体间的关系从文本中提取出来
    在这里插入图片描述
  • 实体统一(Entity Resolution):对于有些实体写法上不一样,但其实是指向同一个实体,需要合并。
  • 指代消解(Disambiguation):文本中出现的“it”, “he”, “she”这些词到底指向哪个实体,比如在本文里两个被标记出来的“it”都指向“hotel”这个实体。

在这里插入图片描述

3.安装并启动Neo4j

先安装好neo4j与jdk,安装并配置环境变量,具体见一个链接
在cmd输入以下命令以启动,启动完毕在浏览器输入http://localhost:7474/访问

neo4j.bat console
  • 1

4.Neo4j实战

4.1创建节点

  • 删除数据库中以往的图,确保一个空白的环境进行操作
    【注:慎用,如果库内有重要信息的话】
 MATCH (n) DETACH DELETE n
  • 1

MATCH是匹配操作,而小括号()代表一个节点node(可理解为括号类似一个圆形),括号里面的n为标识符。

  • 创建一个人物节点
CREATE (n:Person {name:'John'}) RETURN n
  • 1

CREATE是创建操作,Person是标签,代表节点的类型。
花括号{}代表节点的属性,属性类似Python的字典。
这条语句的含义就是创建一个标签为Person的节点,该节点具有一个name属性,属性值是John。

  • 创建更多的人物节点,并分别命名
  1. CREATE (n:Person {name:'Sally'}) RETURN n;
  2. CREATE (n:Person {name:'Steve'}) RETURN n;
  3. CREATE (n:Person {name:'Mike'}) RETURN n;
  4. CREATE (n:Person {name:'Liz'}) RETURN n;
  5. CREATE (n:Person {name:'Shawn'}) RETURN n;
  • 1
  • 2
  • 3
  • 4
  • 5

分号;代表分开一句句运行

  • 创建地区节点
  1. CREATE (n:Location {city:'Miami', state:'FL'})
  2. CREATE (n:Location {city:'Boston', state:'MA'})
  3. CREATE (n:Location {city:'Lynn', state:'MA'})
  4. CREATE (n:Location {city:'Portland', state:'ME'})
  5. CREATE (n:Location {city:'San Francisco', state:'CA'})
  • 1
  • 2
  • 3
  • 4
  • 5

节点类型为Location,属性包括city和state

4.2创建关系

  • 朋友关系
  1. MATCH (a:Person {name:'Liz'}),
  2. (b:Person {name:'Mike'})
  3. MERGE (a)-[:FRIENDS]->(b)
  • 1
  • 2
  • 3

方括号[]即为关系,FRIENDS为关系的类型。
注意这里的箭头–>是有方向的,表示是从a到b的关系。 这样,Liz和Mike之间建立了FRIENDS关系。

  • 关系增加属性
  1. MATCH (a:Person {name:'Shawn'}),
  2. (b:Person {name:'Sally'})
  3. MERGE (a)-[:FRIENDS {since:2001}]->(b)
  • 1
  • 2
  • 3
  • 增加更多的朋友关系
  1. MATCH (a:Person {name:'Shawn'}), (b:Person {name:'John'}) MERGE (a)-[:FRIENDS {since:2012}]->(b)
  2. MATCH (a:Person {name:'Mike'}), (b:Person {name:'Shawn'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
  3. MATCH (a:Person {name:'Sally'}), (b:Person {name:'Steve'}) MERGE (a)-[:FRIENDS {since:2006}]->(b)
  4. MATCH (a:Person {name:'Liz'}), (b:Person {name:'John'}) MERGE (a)-[:MARRIED {since:1998}]->(b)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

4.3创建出生地关系

  • 建立不同类型节点之间的关系-人物和地点的关系
  1. MATCH (a:Person {name:'John'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1978}]->(b)
  2. MATCH (a:Person {name:'Liz'}), (b:Location {city:'Boston'}) MERGE (a)-[:BORN_IN {year:1981}]->(b)
  3. MATCH (a:Person {name:'Mike'}), (b:Location {city:'San Francisco'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
  4. MATCH (a:Person {name:'Shawn'}), (b:Location {city:'Miami'}) MERGE (a)-[:BORN_IN {year:1960}]->(b)
  5. MATCH (a:Person {name:'Steve'}), (b:Location {city:'Lynn'}) MERGE (a)-[:BORN_IN {year:1970}]->(b)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 创建节点的时候就建好关系
CREATE (a:Person {name:'Todd'})-[r:FRIENDS]->(b:Person {name:'Carlos'})
  • 1

在这里插入图片描述

4.4图数据库查询

  • 查询下所有在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

4.5删除和修改

  • 增加/修改节点的属性
  1. MATCH (a:Person {name:'Liz'}) SET a.age=34
  2. MATCH (a:Person {name:'Shawn'}) SET a.age=32
  3. MATCH (a:Person {name:'John'}) SET a.age=44
  4. MATCH (a:Person {name:'Mike'}) SET a.age=25
  • 1
  • 2
  • 3
  • 4
  • 删除节点的属性
  1. MATCH (a:Person {name:'Mike'}) SET a.test='test'
  2. MATCH (a:Person {name:'Mike'}) REMOVE a.test
  • 1
  • 2
  • 删除节点
MATCH (a:Location {city:'Portland'}) DELETE a
  • 1
  • 删除有关系的节点
MATCH (a:Person {name:'Todd'})-[rel]-(b:Person) DELETE a,b,rel
  • 1

5.通过 Python 操作 Neo4j

5.1.neo4j模块:执行CQL ( cypher ) 语句

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

上述程序的核心部分,抽象一下就是:
neo4j.GraphDatabase.driver(xxxx).session().write_transaction(函数(含tx.run(CQL语句)))
neo4j.GraphDatabase.driver(xxxx).session().begin_transaction.run(CQL语句)

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

  1. # step 1:导包
  2. from py2neo import Graph, Node, Relationship
  3. gragh = Graph('bolt://localhost:7687', auth = ('username', 'password'))
  4. # step 2:构建图
  5. g = Graph()
  6. # step 3:创建节点
  7. tx = g.begin()
  8. a = Node("Person", name="Alice")
  9. tx.create(a)
  10. b = Node("Person", name="Bob")
  11. # step 4:创建边
  12. ab = Relationship(a, "KNOWS", b)
  13. # step 5:运行
  14. tx.create(ab)
  15. tx.commit()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

6.通过csv文件批量导入图数据

csv分为两个nodes.csv和relations.csv,注意关系里的起始节点必须是在nodes.csv里能找到的

  1. # nodes.csv需要指定唯一ID和nam,
  2. headers = [
  3. 'unique_id:ID', # 图数据库中节点存储的唯一标识
  4. 'name', # 节点展示的名称
  5. 'node_type:LABEL', # 节点的类型,比如Person和Location
  6. 'property' # 节点的其他属性
  7. ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. # relations.csv
  2. headers = [
  3. 'unique_id', # 图数据库中关系存储的唯一标识
  4. 'begin_node_id:START_ID', # begin_node和end_node的值来自于nodes.csv中节点
  5. 'end_node_id:END_ID',
  6. 'begin_node_name',
  7. 'end_node_name',
  8. 'begin_node_type',
  9. 'end_node_type',
  10. 'relation_type:TYPE', # 关系的类型,比如Friends和Married
  11. 'property' # 关系的其他属性
  12. ]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 两个文件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
  1. 重启neo4j
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/790306
推荐阅读
相关标签
  

闽ICP备14008679号