以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  请问大侠:我在用SPARQL查询RDF模型时遇到的困难,求救  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=36732)


--  作者:lqm
--  发布时间:8/13/2006 10:45:00 AM

--  请问大侠:我在用SPARQL查询RDF模型时遇到的困难,求救
最近再学习SPARQL语言查询RDF时遇到很多困难,我用的是Jena接口语言如下:
我使用的RDF文件内容(test.rdf):
<?xml version="1.0"?>
  <rdf:RDF xmlns:rdf   = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
           xmlns:DC   = "http://purl.org/dc/elements/1.1/"
           xmlns:vCard = "http://www.w3.org/2001/vcard-rdf/3.0#"
           xmlns:HongLM="http://127.0.0.1/HongLM#">
              
   <rdf:Description rdf:about = "http://qqqfoo.com/annual-report.html" >
    <DC:title> Annual Report 1999/2000 </DC:title>
    <DC:creator rdf:parseType="Resource">
      <vCard:FN> Corky Crystal </vCard:FN>
      <vCard:N rdf:parseType="Resource">
        <vCard:Family> Crystal </vCard:Family>
        <vCard:Given>  Corky </vCard:Given>
      </vCard:N>
      <vCard:EMAIL rdf:parseType="Resource">
        <rdf:value> corky@qqqfoo.com </rdf:value>
        <rdf:type rdf:resource="http://www.w3.org/2001/vcard-rdf/3.0#internet"/>
      </vCard:EMAIL>
    </DC:creator>
    <DC:date> 2000-10-01 </DC:date>
    <DC:subject> Company Report, Outcomes, Objectives </DC:subject>
    <DC:publisher> qqqfoo.com Pty Ltd </DC:publisher>
    <DC:rights> Copyright 2000 </DC:rights>
   </rdf:Description>
  <rdf:Description rdf:about ="http://127.0.0.1/HongLM/rt34.htm">
    <HongLM:master>Jia Bao Yu</HongLM:master>
    <HongLM:hasservant>Qin Wen</HongLM:hasservant>
    <HongLM:haswife>Xue Bao Cha</HongLM:haswife>
  </rdf:Description>
  </rdf:RDF>
我用的查询模式:
"PREFIX  rdfs:<http://www.w3.org/2000/01/rdf-schema#>"+
"PREFIX  HongLM:<http://127.0.0.1/HongLM#>"+
"SELECT ?x  ?obj " +
"WHERE {" +
     "?x DC:title  ?obj."   
       +  "}";
利用这种方法可以查询,如DC:title,DC:date,DC:subject,DC:publisher, DC:rights之类的节点,但是要查询类似,DC:creator,vCard:EMAIL这些符合节点则不能得到查询结果。
例如:
"SELECT ?x ?creator"+
"Where {"+
"?x  DC:creator  ?y ."+
"?y  vCard:FN    ??creator ."+  "}";执行的结果,不报错,无结果返回。

参考程序如下:
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
public class Rdqowl
{
public static void main(String args[])
    {
        // Open The  RDF or OWL  graph from the filesystem
try
{
InputStream in = new FileInputStream(new File("test.rdf"));

// Create an empty in-memory model and populate it from the graph
Model model = ModelFactory.createMemModelMaker().createModel();
model.read(in,null); // null base URI, since model URIs are absolute
in.close();
String queryString =      
"PREFIX  vCard:<http://www.w3.org/2001/vcard-rdf/3.0>"+
"PREFIX  DC:<http://purl.org/dc/elements/1.1/>"+
Select "?x   DC:title   ?title"
"WHERE {" +
"{ ?x  DC:creator  ?c.}  "+
" OPTIONAL { ?c vCard:FN   ?fname } ."+
  "FILTER isBlank(?c)"
   +  "      }";              
Query query = QueryFactory.create(queryString);
// Execute the query and obtain results
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();


// Output query results 
ResultSetFormatter.out(System.out, results, query);

// Important - free up resources used running the query
qe.close();

}
catch (Exception ex)
        {
            ex.printStackTrace();
        }


    }
}
还有一问?
用上面的方法怎么查询OWL文件?


--  作者:lqm
--  发布时间:8/14/2006 11:40:00 AM

--  
盼望哪位大侠能给我一点指点,谢谢
--  作者:jpz6311whu
--  发布时间:8/14/2006 4:34:00 PM

--  
package test;//jpz mod

import java.io.InputStream;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.*;
import com.hp.hpl.jena.query.*;
import com.hp.hpl.jena.rdf.model.*;
import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
public class TestSparql
{
public static void main(String args[])
    {
        // Open The  RDF or OWL  graph from the filesystem
try
{
InputStream in = new FileInputStream(new File("src/test/test.rdf"));//jpz mod

// Create an empty in-memory model and populate it from the graph
Model model = ModelFactory.createMemModelMaker().createModel();
model.read(in,null); // null base URI, since model URIs are absolute
in.close();
String queryString =      
"PREFIX  vCard: <http://www.w3.org/2001/vcard-rdf/3.0>"+
"PREFIX  DC: <http://purl.org/dc/elements/1.1/>"+
"Select ?x      ?title" + //jpz mod
"WHERE {" +
"{ ?x  DC:creator  ?c.}  "+
" OPTIONAL { ?c vCard:FN   ?fname } ."+
  "FILTER isBlank(?c)"
   +  "      }";              
Query query = QueryFactory.create(queryString);
// Execute the query and obtain results
QueryExecution qe = QueryExecutionFactory.create(query, model);
ResultSet results = qe.execSelect();


// Output query results
ResultSetFormatter.out(System.out, results, query);

// Important - free up resources used running the query
qe.close();

}
catch (Exception ex)
        {
            ex.printStackTrace();
        }


    }
}

---------------------
以上//jpz mod是我改过的地方
程序运行结果:
-------------------------------------------------------
| x                                      | titleWHERE |
=======================================================
| <http://qqqfoo.com/annual-report.html> |            |
-------------------------------------------------------


--  作者:lqm
--  发布时间:8/15/2006 5:11:00 PM

--  
谢谢,不过我测试了一下,可以运行,结果也同你给出的一样,我想要的结果是:
-------------------------------------------------------
| x                                                                       | fname |
=======================================================
| <http://qqqfoo.com/annual-report.html> |            | Corky crystal

-------------------------------------------------------


--  作者:lqm
--  发布时间:8/15/2006 5:14:00 PM

--  
也就是说,要<http://qqqfoo.com/annual-report.html> 和它的
<vCard:FN> Corky Crystal </vCard:FN>
      <vCard:N rdf:parseType="Resource">
        <vCard:Family> Crystal </vCard:Family>
        <vCard:Given>  Corky </vCard:Given>
      </vCard:N>
对于这些复合节点就不能得到查询的结果。
请你再帮帮我看看哈!
--  作者:jpz6311whu
--  发布时间:8/15/2006 6:25:00 PM

--  
程序中
<http://www.w3.org/2001/vcard-rdf/3.0>
改为:
<http://www.w3.org/2001/vcard-rdf/3.0#>
明白了吧?
--  作者:lqm
--  发布时间:8/15/2006 9:44:00 PM

--  
哦,果然是这样的,谢谢哈!
我想了好久,看看还是你们这些大侠厉害,佩服,佩服!!!!!!
--  作者:lqm
--  发布时间:8/15/2006 10:09:00 PM

--  
谢谢,楼上的大侠,按照你的提示,果然能够查询比较复杂的RDFS数据了
我还想问的是,如果我想查询OWL模型数据,是不是也很方便?
请赐教哈!!!
热心的大侠,先谢谢哈!!!!!
--  作者:jpz6311whu
--  发布时间:8/15/2006 10:48:00 PM

--  
owl就是一种rdf啊
方便不方便我没比较过,但是肯定能查询
--  作者:lqm
--  发布时间:8/16/2006 12:21:00 AM

--  
谢谢你及时提醒哈
好的,我认真研究一下怎么用SPARQL来查询OWL!
我具体去做一下看看,感觉有什么区别!

--  作者:lqm
--  发布时间:8/16/2006 5:21:00 PM

--  
谢谢,大侠们的提醒,已经能够查询一些OWL了,如果遇到有复杂的查询,不清楚还要求助哈!!!!!!!
--  作者:lqm
--  发布时间:8/17/2006 8:24:00 AM

--  
谢谢大侠们的及时指导,我的疑问已经基本解决!
用SPARQL可以查询OWL了!!!

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
93.750ms