知识图谱neo4j的相关使用
1. neo4j下载
neo4j下载地址及安装:https://neo4j.com/download/
下载社区版neo4j不支持创建多个数据库怎么办?
两种方法:
- 修改neo4j.conf配置文件中的#dbms.active_database=graph.db,将graph.db修改为新的数据库的位置(配置文件一般在neo4j\conf下);
- 更改原先的graph.db的文件夹名称(如改为graph_1.db),新建graph.db作为新的数据库。
2. neo4j简单使用
cypher语句:https://neo4j.com/developer/cypher/intro-cypher/
2.1创建节点及关系
同时创建多部电影
create (:film {name:'肖申克的救赎',type:'犯罪',score:9.7}), (:film {name:'霸王别姬',type:'剧情',score:9.6}), (:film {name:'辛德勒的名单',type:'历史',score:9.5}), (:film {name:'盗梦空间',type:'剧情',score:9.3}), (:film {name:'星际穿越',type:'剧情',score:9.3}), (:film {name:'荆轲刺秦王',type:'历史',score:8.2}), (:film {name:'绿里奇迹',type:'剧情',score:8.9})
一般create创建关系和节点,但需要注意的是create会产生一样的节点,只是id会不一样,因此当不确定已有的库中是否包含某个节点时,可以使用merge进行创建,因为merge是有去重功能的。
同时创建多个导演
在这里插入代码片create (:director {name:'弗兰克·德拉邦特'}), (:director {name:'陈凯歌'}), (:director {name:' 史蒂文·斯皮尔伯格'}), (:director {name:'克里斯托弗·诺兰'})
同时创建多个演员
create (:actor {name:'蒂姆·罗宾斯'}), (:actor {name:'张国荣'}), (:actor {name:'连姆·尼森'}), (:actor {name:'马修·麦康纳'}), (:actor {name:'张丰毅'})
创建电影“肖申克的救赎”和导演“弗兰克·德拉邦特”关系
MATCH(a:director),(b:film) WHERE a.name='弗兰克·德拉邦特' AND b.name='肖申克的救赎' CREATE(a)-[r:direct]->(b)
创建电影和演员关系
MATCH(a:actor),(b:film) WHERE a.name='张国荣' AND b.name='霸王别姬' CREATE(a)-[r:play]->(b)
创建一个导演与多个电影的关系
MATCH(a:actor),(b:film) WHERE a.name='张丰毅' AND (b.name='霸王别姬' or b.name='荆轲刺秦王') CREATE(a)-[r:play]->(b)
2.2 查询节点及关系
查询某个电影
MATCH(a:film) WHERE a.name='霸王别姬' RETURN a
查询某个标签下的所有节点
MATCH(a:director) RETURN a
查询两个节点间的关系
MATCH (:director {name:'弗兰克·德拉邦特'})-[r]->(:film{name:'肖申克的救赎'}) RETURN r
通过函数type获取关系的类型
MATCH ()-[r]->(:film{name:'肖申克的救赎'}) RETURN type(r)
2.3 删除节点及关系
删除某个节点
MATCH(a:actor) WHERE a.name='马修·麦康纳' DELETE a
删除某个标签的所有节点
MATCH(a:actor) DELETE a
删除所有节点
MATCH(n) DELETE n
删除两个节点的关系
MATCH (:actor {name:'张国荣'})-[r]->(:film {name:'霸王别姬'}) DELETE r
删除某节点的关系
MATCH (:actor {name:'张国荣'})-[r]->() DELETE r
删除某个标签全部的关系
MATCH ()-[r]->(:film) DELETE r
增加节点属性
MATCH(n:film) WHERE n.name='盗梦空间' SET n.language='english'
删除节点属性
MATCH(n:film) WHERE n.name='盗梦空间' REMOVE n.language
需要注意的是,在删除节点之前需要先将和节点相关的关系删除。
2.4 neo4j批量构建节点和关系
基于csv文件导入的方式批量构建节点
基于csv文件导入的方式批量构建关系
- 首先要把文件放到neo4j的对应数据库的import文件(和上文中的conf是同级目录)下
- 导入节点和关系
# 基于csv文件导入的方式批量构建交易所节点 load csv with headers from 'file:///exchange.csv' as line create(:exchange{name:line.name,ch_name:line.ch_name,code:line.code}) # 基于csv文件导入的方式批量构建股票节点 load csv with headers from 'file:///stock_exchange.csv' as line match (a:stock{code:line.stock_code}),(b:exchange{code:line.exchange_code}) create(a)-[r:交易所]->(b) # 基于csv文件导入的方式批量构建节点关系 load csv with headers from 'file:///stock_exchange.csv' as line match (a:stock{code:line.stock_code}),(b:exchange{code:line.exchange_code}) create(a)-[r:交易所]->(b)
3. py2neo的使用
import py2neo from py2neo import Graph,Node,Relationship,NodeMatcher #账号密码 g = Graph('http://localhost:7474',user='neo4j',password='123456') import pandas as pd df = pd.read_csv('DreamOfRedChamber.csv') from tqdm import tqdm for i, row in tqdm(df.iterrows()): print(row['head'],row['tail'],row['relation'],row['label']) start_node = Node("Person",name=row['head']) g.create(start_node) end_node = Node("Person",name=row['tail']) g.create(end_node) relation = Relationship(start_node,row['label'],end_node) g.create(relation) g.run("match(p:Person {name:'林黛玉'})-[k:丫鬟]-(r)return p,k,r")
4. 相关算法链接
lovain算法:
https://neo4j.com/docs/graph-data-science/current/algorithms/louvain/
Page-Rank算法:https://neo4j.com/docs/graph-algorithms/current/algorithms/page-rank/
基于pytorch的知识表示:
https://github.com/thunlp/OpenKE
图神经网络框架: