我想得到我的本体论的所有类.这是我的由Protege创建的RDF/XML格式的本体文件的一部分:
<!-- http://www.w3.org/2002/07/owl#aqua -->
<Class rdf:about="&owl;aqua"/>
<!-- http://www.w3.org/2002/07/owl#varioPerfect -->
<Class rdf:about="&owl;varioPerfect"/>
Run Code Online (Sandbox Code Playgroud)
我编写了这个查询,它在Protege中正常工作,但是当我在dotNetRDF中使用它时,它返回类的完整URI而不仅仅是它的名字.
public string[] ontologysearch()
{
List<string> list = new List<string>();
TripleStore store = new TripleStore();
Graph mygraph = new Graph();
mygraph.LoadFromFile("D:/msc/search-engine/project/catalogXML.owl");
store.Add(mygraph);
string sparqlQuery1 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "SELECT distinct ?cls1"
+ " WHERE{"
+ " ?cls1 a owl:Class .}";
SparqlQueryParser sparqlParser = new SparqlQueryParser();
SparqlQuery query = sparqlParser.ParseFromString(sparqlQuery1);
InMemoryDataset ds = new InMemoryDataset(mygraph);
//Get the Query processor
ISparqlQueryProcessor processor = new LeviathanQueryProcessor(ds);
Object results = processor.ProcessQuery(query);
if (results is SparqlResultSet)
{
SparqlResultSet r = results as SparqlResultSet;
foreach (SparqlResult res in r)
{
list.Add(res["cls1"].ToString());
}
}
return list.ToArray();
Run Code Online (Sandbox Code Playgroud)
}
我预期的结果只是"aqua",但实际上是" http://www.w3.org/2002/07/owl#aqua ".为什么会发生这种情况,我该如何检索名称呢?
IRI识别RDF和OWL中的非匿名资源.你的本体论明确指出http://www.w3.org/2002/07/owl#aqua是上课的.如果你要求上课,那就是你应该得到的.可能是Protege在显示结果时剥离了http://www.w3.org/2002/07/owl#部分,但结果仍然是IRI.
注意:您真的不应该定义其IRI以标准OWL名称空间开头的新类.您应该定义自己的前缀,通常与本体IRI相关.
如果你只想得到字符串"aqua"作为结果,你有两个选择.第一种(也是首选)方法是检索类的rdfs:标签,如果它有一个,它应该是类的字符串名称.如果由于某种原因不起作用,您可以获取URI的字符串值并去掉前缀的字符串值.以下是DBpedia SPARQL端点上的两种方法的示例:
select ?class ?label where {
?class a owl:Class ; rdfs:label ?label
filter langMatches(lang(?label),'en')
}
limit 10
Run Code Online (Sandbox Code Playgroud)
select ?class ?name where {
?class a owl:Class
bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10
Run Code Online (Sandbox Code Playgroud)
为了显示目的,剥离URI的前缀通常不是推荐的做法,因为它假定URI具有人类可读的形式.在DBPedia恰好可行的情况下,但是大量数据集的URI包含内部代码而不是人类可读的名称.因此,如果rdfs:label(显式定义为资源的人类可读表示)可用,您应该尝试并始终使用它.