2013-03-31 72 views
3

我试图执行一个非常简单的SPARQL查询来根据在查询字符串中传递的名称检索一个人的国籍,但我不明白为什么它不起作用。以下是相关的RDF规则....在SPARQL查询中使用DataTypeProperty文字查询不起作用

<owl:DatatypeProperty rdf:ID="name"> 
<rdfs:domain rdf:resource="#NobelWinner"/> 
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> 
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string">All laureates have a name.</rdfs:comment> 
</owl:DatatypeProperty> 

<owl:DatatypeProperty rdf:ID="nationality"> 
<rdfs:domain rdf:resource="#PersonWinner"/> 
<rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#string"/> 
<rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"> 
Person laureates were associated with a nation when they won the prize. 
</rdfs:comment> 
</owl:DatatypeProperty> 

的代码是一个Java servlet,看起来这样的事情,与SPARQL查询上线42 ....

   try { 
34    String prefix1 = "PREFIX nob:<http://swat.cse.lehigh.edu/resources/onto/nobel.owl#> "; 
35    String prefix2 = "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#> "; 
36    String prefix3 = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#> "; 
37    String prefix4 = "PREFIX nobdat:<http://swat.cse.lehigh.edu/resources/data/nobel/nobeldata.owl#> "; 
38    String prefix = prefix1+prefix2+prefix3+prefix4; 
39    String winnerName = request.getParameter("name"); 
40 
41    // INSERT QUERY 
42    String queryString = prefix + 
43     "SELECT ?nat { ?s nob:name " + winnerName + ". ?s nob:nationality ?nat. }"; 
44 
45    String ttlLoc = "/my/ttl/path/loc.ttl"; 
47    Store store = SDBFactory.connectStore(ttlLoc); 
48    Dataset ds = DatasetStore.create(store) ; 
49 
50    // CREATE QUERY 
51    Query query = QueryFactory.create(queryString); 
52    QueryExecution qe = QueryExecutionFactory.create(query, ds); 


        while (rs.hasNext()) { 
66      QuerySolution qs = rs.nextSolution(); 
67      String nationality = qs.getLiteral("?nat").toString(); 
68      out.println("<P>Nationality: " + nationality + "</P>"); 
69     } 

我可以不会得到查询或任何类似于它的将使用字符串文字替换名称以在Protege IDE中工作的任何类型的查询。有任何想法吗?多谢你们。

回答

3

winnerName需要一个SPARQL不变,即与报价 - 您可以使用单引号:

.... ?s nob:name '" + winnerName + "' . ?s nob:nationality 

使用Dataset ds = SBDFcatoryconnectDataset(ttlloc) ;

从长期来看,思考如何datset插件ervlet初始化,而不是每个请求。

+0

噢好吧,很酷。谢谢安迪。 – MassStrike

+0

安迪,你是对的,那是一个错误,但在修复它后仍然没有。另外,我在Protege编辑器中使用了引号,也没有得到任何东西。 – MassStrike