基础介绍
基础数据说明
原始知识数据包含了RDF和owl两种版本的,
RDF版本
包括了术语表、概念表、关系表、映射表。因为标准化映射暂时没有应用场景,只考虑前三项作为基础数据。
原始Schema
概念表:概念ID、概念对应语义标签
术语表:术语ID、术语类型、所属概念ID
关系表:起始概念、目标概念、关系类型、所属关系组
owl版本
owl是基于本体描述逻辑,即DL,语法逻辑侧重于语义网
现在owl常用的标准,基本都是owl2的标准,包含了DL的三个子集:EL、QL、RL。这三种在语法差异貌似不是很大
我在W3C上找到了一个相对官方的版本介绍,owl2
EL 本体结构个体Entities、类Class Expressions、属性Property Expressions、约束Restrictions、公理Axioms
例子
EquivalentClasses(
<http://omaha.org.cn/1193786>
ObjectIntersectionOf(
<http://aaa.org.cn/1167798>
<http://aaa.org.cn/1193596>
ObjectSomeValuesFrom(
ahat:R053
ObjectSomeValuesFrom(
ahat:R003 <http://aaa.org.cn/1276138>
)
)
)
)
个人感觉这种语法结构在专业概念表述还是很到位的
上面是表示一个概念A等同于概念1167798、1193596的交集,且R003关系的目标实体是1276138
更深入了解相关语法,可以参考 文档
提供对owl格式语法支持的,我接触了owlapi、Jena、protege的相关支持包等,相对而言Jena更友好一些,owlapi有代码文档,但是缺少相关示例,只能到它的源码和测试代码研究,累累。protege对版本什么的有要求,因为我的protege包版本原因,找不到支持owl解析的相关jar包,没有办法使用,但是总体而言,用起来都不是特别爽,也可能是我Java不太熟
Jena有关于owl本体语言的支持,并集成了基于owl2的推理机
但是最近几年感觉这一块东西没有什么更新,感觉工业用的人不多,怀疑是语法的严格,导致只适用于知识专家人工构建,难实现基于AI的大规模图谱建设
rdf文件创建图数据库
这里是拿NEO4J来做的图数据库
NEO4J
NEO4J目前常用的版本,主要是3.5和4以上的,他们所支持的算法包等版本存在差异,neo4j 3.5 搭配Neo4j_Graph_Algorithms_r3,neo4j 4以上支持的是 Graph Data Science,里面支持的算法也有一定差异
NEO4J 安装包下文件列表:
- bin 是Neo4j支持的各种shell启动工具,支持启动、关闭、导入数据等
- data 包括了数据库和事务相关文件夹,每个新建的数据库,会在对应目录新建该库相关的。对数据库不专业,也只知道这些
- config 配置文件,可以配置远程访问、端口号、安全设置、内存占用控制等。另外安装Neo4j插件,如apoc,gdsl等,也需要在这里配置才可以使用
- logs
- plugins 主要用来放各种插件的,如apoc,gdsl
- lib 各种jar包
- labs neo4j把apoc直接放在这个目录下了,省了安装麻烦,拷到plugins 就好
Neo4j 概念
- 节点Node:即实体,可以是我们上文提到的概念和术语都可以作为实体
- 标签Label:作用于Node,即为实体赋予标签,比如 实体(新冠肺炎)对应的标签是
疾病
,也就是Node的类别,圈定一个实体域是某个label,我理解也对应于图谱建设时的NER标签设计 - 关系Relationship:就是说两个实体的关系咯,有了关系,才是一个图
- 关系类型Relationship type:作用于关系滴,就是关系的类型了
- Properties 属性:Node和Relationship都可以有属性
- Traversals and paths 遍历和路径
- Schema 不是必须构建的
- Indexes 索引 提升查询效率
- Constraints 约束 指定唯一性约束等等
在对图谱的理解上,关系既包含了属性关系、也包含了实体关系,在这里属性关系以属性来展现了
数据格式处理
RDF原始文本转换成可导入的CSV格式
列类型标注,在数据导入时,导入程序根据列名决定应该作为节点还是属性还是关系等等,和原始表头以:分割
如概念表的原始数据表头[‘id’, ‘releaseDate’, ‘status’, ‘semanticTag’]
导入数据库时的表头:[‘conceptId:ID(Concept)’, ‘releaseDate’, ‘status’, ‘semantictagid’, ‘semantictagname:LABEL’]
- :ID表示,该列为每行的标识符,全局ID列,用于在以后重新连接时查找节点
- :LABEL 表示,该列是每行的标签列,对应的是每个实体的语义标签,多个标签可以用定界符分隔
- :START_ID 表示关系起始列
- :END_ID 表示关系目标列
- :TYPE 表示关系类型列
没有设置这些标志的列,在数据库中做为属性列
导入数据
数据导入有多种方式,包括命令行import【1】,在cypher执行load csv【2】 ,以及通过相关库调用create【3】等等导入数据。三者分别适用的导入场景:数据量由大到小1>2>3;灵活程度3>2>1;
这里主要写一下 neo4j-admin的方式
./bin/neo4j-admin import
–database 指定导入数据存放的数据库名称 ,该名称数据库只能是未被创建的数据库,这种导入方式没有办法在已有数据库基础上append,要是有大佬知道append的方法,欢迎留言指点
–nodes 节点文件 可以放多个
–relationships 关系文件 可以放多个
这种导入方式必须保证数据库时关闭的,导入成功后再重启
./bin/neo4j-admin import --database=dbexam.db --nodes="./import/concept1.csv" --nodes="./import/concept2.csv" --relationships="./import/OMAHA七巧板医学术语集_关系1_最新版_20210420.csv" --relationships="./import/relations1.csv" --relationships="./import/relations2.csv"
Cypher
语法概览
用法详细介绍
以上都是基于4版本的
这是一种声明式语言,向机器描述我们想要查询的数据pattern
关键字
match 类似于 select
create 创建
delete 删除
where 筛选条件
with 声明局部变量,可以结合聚合函数,如count等,可以用来模拟group by
as 别名
ORDER BY 顺序
SKIP 分页
LIMIT 限制返回条数
有很多和SQL类似的语法,这里主要写一些不一致的
() 节点
[] 关系
{} 属性
- 关系
-> 带方向的关系
<- 带方向的关系
<> 比较两个值 表示不等于关系
call{} 子查询
unwind 把一个列表拆成多行,和 as搭配
UNWIND $listOfMaps AS properties
类似于
for properties in $listOfMaps
函数
collect() 多行聚合成一行
节点函数
id()-获取节点或关系的id
type()-获取关系的类型
labels()-获取节点标签
keys()-获取节点或关系的属性key
properties()-获取节点或关系的属性
关系函数
nodes(path) 返回路径经过的所有节点
relationships(path) 返回路径存在的关系
路径函数
shortestPath() 获取指定pattern 的最短路径
allShortestPaths() 获取指定pattern的所有路径
一些栗子
match [r:`2`|`0`|`1`] return r
表示标签是2或者0或者1的关系
match (n:`User`:`Admin`) return n
表示标签同时是User和Admin的节点
match p=(m:{conceptId:'1223344'})-[:`子类`*1..]->(n)
call{
with n
match t=(n)-[:`部位`]->(z)
return z
}
return n,z
和
match p=(m:{conceptId:'12233445'})-[:`子类`*1..]->(n)
unwind n as pn
match t=(pn)-[:`部位`]->(z)
return pn,z
都是查询概念1223344的所有父类以及部位,with 关键字 在子查询里面引用外部变量
match p=(m:{conceptId:'1223344'})-[:`子类`*1..]->(n)
call{
match t=(n)-[:`部位`]->(z)
return z
}
return n,z
子查询不使用with,子查询内部,就是一个新的作用域,子查询内部的n和外部变量n是两个变量,子查询返回的是所有关系标签是”部位“的pattern的目标概念
查看查询内部的执行顺序,可以通过PROFILE关键字实现,可以更细节了解内部查询过程,在查询优化上可以用到
Python 操作图数据库
Python 常用的操作neo4j的库有neo4j等
GDSL
全称是Graph Data Science Library,是支持在neo4j4.0版本上的。我简单罗列的目录,深入需要写好多篇了(主要还是因为不太懂哈哈)
图管理
子图管理,在不同的分析或挖掘场景下,建立不同的子图。可以通过Native projection 或者 Cypher projection的方式创建
模型管理
基于图算法训练得到的模型管理,包括exists、list、load等等
Algorithms
分了3个等级,感觉是按照成熟程度划分的,Production-quality>Beta>Alpha
涉及了Node embeddings、Community detection algorithms、相似度、路径发现算法、链接预测等等
自定义算法
根据官网描述,确定支持通过Pregel Java API自定义算法。目前有Pregel的Python版本,但具体实用性不知,没有实践就没有发言权