JavaAPI~jena(OWL、RDF、ARQ、XML)

1.OWL

OWL用于表示丰富和复杂的知识,包括事物、事物组和事物之间的关系。它的关键部分是能够以更有趣和更复杂的方式来描述类。OWL核心是围绕三元组的,即我们在很多资料中看到的陈述(Statement),它的组成为:Statement=(Subject,Property,Object),其中Subject我们熟成为主体,Property成为属性,Object成为客体。
举个栗子:Statement=(餐具,装,食物)
餐具:主体,可以为碗也可以为盘子
食物:客体,可以为馒头也可以为米饭
从这个角度来说,主体和客体是类
OntPropety用来创建属性(关系),Individual用来创建个体

2.RDF

例:《XXX》的作者是XX:在这个陈述句中,《XXX》是主体,作者是谓语,XX是客体。
RDF就是这些一个个的陈述语句构成的,RDF模型可以转换成图结构,其中主体和客体代表图的节点,谓语代表边。
这里写图片描述

java代码

pom.xml中引入jar包

<dependency>
      <groupId>com.hp.hpl.jena</groupId>
      <artifactId>jena</artifactId>
      <version>2.6.0</version>
      <type>pom</type>
</dependency>

<dependency>
        <groupId>org.apache.jena</groupId>
        <artifactId>apache-jena-libs</artifactId>
        <type>pom</type>
        <version>3.5.0</version>
</dependency>

创建如下关系
这里写图片描述

package com.testJenaRDF.test;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.vocabulary.VCARD;

public class StatementDemo {
     public static void main(String[] args) throws FileNotFoundException{  

            //Introduction  
            String personURI = "http://somewhere/JohnSmith";  
            String givenName = "John";  
            String familyName = "Smith";  
            String fullName = givenName + " " + familyName;  

            //整体模型用Model 类来表示
            Model model = ModelFactory.createDefaultModel();  

            //资源用 Resource 类来表示、johnSmith为主体
            Resource johnSmith = model.createResource(personURI);

            //属性用 Property 类来表示,,添加属性
            //给johnSmith这个人,加入名字为FN的关系
            johnSmith.addProperty(VCARD.FN, fullName);
            johnSmith.addProperty(VCARD.N,   
                        model.createResource()  
                            .addProperty(VCARD.Given, givenName)  
                            .addProperty(VCARD.Family, familyName));  

            //每个箭头都是一个Statement,每个箭头都由实体 谓语 客体三个部分组成  
            StmtIterator iter = model.listStatements();  

            while(iter.hasNext()){  
                Statement stmt = iter.nextStatement();  
                Resource subject = stmt.getSubject();  
                Property predicate = stmt.getPredicate();  
                RDFNode object = stmt.getObject();  

                System.out.print(subject.toString());  
                System.out.print(" "+predicate.toString());  
                if(object instanceof Resource){  
                    System.out.print(object.toString());  
                }else{  
                    System.out.print("\"" + object.toString() + "\"");  
                }  

                System.out.println(" .");  
            } 


          //Model write输出  
            model.write(System.out);  
            System.out.println();  
            model.write(System.out, "RDF/XML-ABBREV");  
            System.out.println();  
            System.out.println("------------------------------------");
            //在桌面创建a.rdf文件
            File outfile = new File("C:/Users/Administrator/Desktop/a.rdf");
            FileOutputStream outputStream = new FileOutputStream(outfile);
            model.write(System.out, "N-TRIPLE");
            //将model存入该文件中
            model.write(outputStream, "RDF/XML-ABBREV");
        }  
}

3.ARQ

ARQ是Jena的一个查询引擎,支持SPARQL的RDF查询语言。
数据源,一个RDF文件sparql.rdf,文档描述一些简单的人名信息,下面是类似三元组形式的数据表示

<?xml version="1.0"?>

<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"

  xmlns:vCard="http://www.w3.org/2001/vcard-rdf/3.0#">

  <rdf:Description rdf:about="http://somewhere/MattJones/">

    <vCard:FN>Matt Jones</vCard:FN>

      <vCard:N rdf:parseType="Resource">

        <vCard:Family>Jones</vCard:Family>

        <vCard:Given>Matthew</vCard:Given>

      </vCard:N>

  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/RebeccaSmith/">

    <vCard:FN>Becky Smith</vCard:FN>

    <vCard:N rdf:parseType="Resource">

      <vCard:Family>Smith</vCard:Family>

      <vCard:Given>Rebecca</vCard:Given>

    </vCard:N>

  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/JohnSmith/">

    <vCard:FN>John Smith</vCard:FN>

    <vCard:N rdf:parseType="Resource">

      <vCard:Family>Smith</vCard:Family>

      <vCard:Given>Jones</vCard:Given>

    </vCard:N>

  </rdf:Description>

  <rdf:Description rdf:about="http://somewhere/SarahJones/">

    <vCard:FN>Sarah Jones</vCard:FN>

    <vCard:N rdf:parseType="Resource">

      <vCard:Family>Jones</vCard:Family>

      <vCard:Given>Sarah</vCard:Given>

    </vCard:N>

  </rdf:Description>

</rdf:RDF>

基本查询语句

1.查询FN为John Smith的主体

package com.testJenaRDF.test;

import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class sparqlTest {
    public static String inputFileName = "C:/Users/Administrator/Desktop/sparql.rdf"; 
    public static void main(String[] args) {
        Model model = ModelFactory.createMemModelMaker().createDefaultModel();
        model.read(inputFileName);
        String queryString = "SELECT ?x  WHERE { ?x <http://www.w3.org/2001/vcard-rdf/3.0#FN>  'John Smith' }";
        Query query = QueryFactory.create(queryString);
        QueryExecution qe = QueryExecutionFactory.create(query, model);
        ResultSet results = qe.execSelect();
        ResultSetFormatter.out(System.out, results, query);
        qe.close();
    }
}

这里写图片描述

2.查询谓语为FN的主体,返回值为谓语和主体

String queryString = "SELECT ?x ?fname WHERE {?x  <http://www.w3.org/2001/vcard-rdf/3.0#FN>  ?fname}";

这里写图片描述

3.查询姓Smith的 名字

String queryString = "SELECT ?givenName WHERE  { ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Family>  'Smith' . ?y  <http://www.w3.org/2001/vcard-rdf/3.0#Given>  ?givenName .}";

这里写图片描述

根据命名空间查询

//命名空间的简写替代 vcard 代替<http://www.w3.org/2001/vcard-rdf/3.0#>
 "PREFIX vcard:<http://www.w3.org/2001/vcard-rdf/3.0#>"
 "SELECT ?y ?givenName WHERE { ?y vcard:Family 'Smith' . ?y vcard:Given  ?givenName . }";

这里写图片描述

4.过滤查询结果 ”r”表示,名字中必须出现的字母”r”或”R” ”i”表示,对签名的字母限制,默认不加对大小写敏感,加上则对大小写不敏感。

"PREFIX vcard: <http://www.w3.org/2001/vcard-rdf/3.0#>"+
"SELECT ?g "+//?g 后面加空格很重要
"WHERE { ?y vcard:Given ?g . FILTER regex(?g, 'r', 'i')}";       // FILTER (?age >= 24)}

这里写图片描述

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值