2012-10-09 43 views
1

我有這樣的Java代碼,使用Apache耶拿API,查詢比薩餅本體獲取後,才從SPARQL查詢 「#」

String queryStr = 
"prefix pizza: <" + PIZZA_NS + "> "    + 
"prefix rdfs: <" + RDFS.getURI() + "> "   + 
"prefix owl: <" + OWL.getURI() + "> "    + 
"select ?pizza where {?pizza a owl:Class ; "  + 
"rdfs:subClassOf ?restriction. "     + 
"?restriction owl:onProperty pizza:hasTopping ;" + 
"owl:someValuesFrom pizza:PeperoniSausageTopping" + 
"}"; 


Query query = QueryFactory.create(queryStr); 
QueryExecution qe = QueryExecutionFactory.create(query, model); 
ResultSet rs = qe.execSelect(); 


ArrayList rsList = (ArrayList)ResultSetFormatter.toList(rs); 
for(int i=0;i<rsList.size();i++){ 
    out.println(rsList.get(i).toString()); 
} 

它返回這個名字:

(?pizza = <http://www.co-ode.org/ontologies/pizza/pizza.owl#AmericanHot>) 
(?pizza = <http://www.co-ode.org/ontologies/pizza/pizza.owl#FourSeasons>) 
(?pizza = <http://www.co-ode.org/ontologies/pizza/pizza.owl#American>) 

但我需要只有

AmericanHot

FourSeasons

美國

如何獲得這樣的結果?

+0

我想應該有一個更多的鏈接到這些項目的文本 – Randy

+0

@Randy對不起,我不明白,我是新的SPARQL,這是什麼意思? –

+1

我在猜測他的意思是你不應該試圖將#後面的那個位用作資源的「人類可讀名稱」。相反,您應該查詢連接到每個URI的'rdfs:label'屬性。 –

回答

3

檢索SPARQL 1.1功能STRAFTER可以幫助:

SELECT ?pizza (strafter(str(?pizza), "#") AS ?localName) 
WHERE 

,但客戶端解決方案是一樣的好,適用於SPARQL 1.0。

+0

謝謝安迪爲你解答!這是一個很好的信息! –

5

我以這種方式解決了這個問題。

for (; rs.hasNext() ;){ 
    QuerySolution soln = rs.nextSolution() ; 
    RDFNode x = soln.get("pizza") ; 
    out.println(x.asNode().getLocalName()); 
} 

對於誰將會有我同樣的問題,其他信息可以從here