Apache jena解析RDF schema

最近做了一个知识图谱schema合法性验证的小项目,是写成了mevan插件的形式,每次项目编译都验证一下,上次写了如何做mvn插件,这次写一下和知识图谱解析相关的一些内容吧。

我们用了jena这个项目。其实mentor他们主要用这个实现了查询之类的一系列东西,我这个项目是他们专门来留给我练手的。

首先说一下schema吧。
我们用的RDF,它描述东西主要是三元组形式。比如:

  • A relationship B:表示A是B的xxx,或者A和B是xxx关系
  • A value “xxx” : 表示 A的值是xxx

它里面也有类和属性的概念。比如m:people.person是一个类,他的ttl描述是

1
2
3
4
m:people.person a owl:Class ;//表示这是一个类
rdfs:label "人"^^xsd:string ;//给了一个可读的值
rdfs:subClassOf m:common.topic ;//rdf也支持子类,虽然我还不知道他支不支持继承啥的
owl:equivalentClass s:1h .//我们做了压缩存储,为了节省空间

而对于属性,我们用生日举例

1
2
3
4
5
6
m:people.person.birthday
a owl:DatatypeProperty ;//这是个熟悉
rdfs:domain m:people.person ;//表示是mpp的属性,domain可以不唯一
rdfs:label "生日"^^xsd:string ;
rdfs:range xsd:string ;//这个属性的值是什么,还有int,貌似还支持日期
owl:equivalentProperty s:3T .

而我这个检查工作主要是把ttl文件读进去,然后验证一些规则。我们有一套自己的定义schema的规则,这里就不说了。主要说一下验证中的一些通用操作。

1
2
3
4
5
6
7
8
9
10
11
OntModel model;//定义一个model
model = ModelFactory.createOntologyModel();
model.read(fis, null, "TTL");//[1]
ExtendedIterator<? extends OntClass> classIt = model.listNamedClasses();//拿到所有class的iterator
while (classIt.has_next()){
OntClass one = classIt.next();
//do sth.
}
ExtendedIterator<OntProperty> datatypeProps = model.listOntProperties();//拿到所有prop的iter
  1. 这个是从文件里读入schema定义。第三个参数定义了具体的格式,它支持ttl,rdf等多种格式,具体文档

主要就是这样,然后利用一些其他的api拿到更为具体的值,做相应的处理就行。

在网上看见一篇写jena overview的文章,这里借用他的形容jena的图

我用的应该是最左边的那一小块。

如果以后有机会继续做这个,争取写写其他部分。

转载请注明出处,谢谢


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2015/10/28/Apache-jena解析RDF-schema/