为什么SPARQL查询返回资源的URI而不是其名称?

为什么SPARQL查询返回资源的URI而不是其名称?,sparql,dotnetrdf,Sparql,Dotnetrdf,我想得到我的本体的所有类。这是Protege创建的RDF/XML格式的本体文件的一部分: 我编写了这个查询,它在Protege中正常工作,但是当我在dotNetRDF中使用它时,它返回类的完整URI,而不仅仅是它的名称 public string[]ontologysearch() { 列表=新列表(); TripleStore=新的TripleStore(); Graph mygraph=新图形(); LoadFromFile(“D:/msc/search engine/project/c

我想得到我的本体的所有类。这是Protege创建的RDF/XML格式的本体文件的一部分:


我编写了这个查询,它在Protege中正常工作,但是当我在dotNetRDF中使用它时,它返回类的完整URI,而不仅仅是它的名称

public string[]ontologysearch()
{
列表=新列表();
TripleStore=新的TripleStore();
Graph mygraph=新图形();
LoadFromFile(“D:/msc/search engine/project/catalogXML.owl”);
store.Add(mygraph);
字符串sparqlQuery1=“前缀rdf:”
+“前缀owl:”
+“前缀xsd:”
+“前缀rdfs:”
+“选择不同的?cls1”
+“其中{”
+“?cls1 a owl:Class.}”;
SparqlQueryParser sparqlParser=新SparqlQueryParser();
SparqlQuery query=sparqlParser.ParseFromString(sparqlQuery1);
InMemoryDataset ds=新的InMemoryDataset(mygraph);
//获取查询处理器
ISparqlQueryProcessor processor=新的LeviathanQueryProcessor(ds);
对象结果=processor.ProcessQuery(查询);
如果(结果为SparqlResultSet)
{
SparqlResultSet r=作为SparqlResultSet的结果;
foreach(r中的SparqlResult)
{
添加(res[“cls1”].ToString());
}
}
return list.ToArray();
}


我期望的结果只是“aqua”,但实际上是“”。为什么会发生这种情况,我如何取回名称

RDF和OWL中的非匿名资源由IRIs识别。你的本体清楚地说明了这一点http://www.w3.org/2002/07/owl#aqua 这是课堂。如果你要求上课,那就是你应该得到的。这可能是Protege从http://www.w3.org/2002/07/owl# 零件显示结果时,但结果实际上仍然是IRI

注意:您确实不应该定义IRI以标准OWL名称空间开头的新类。您应该定义自己的前缀,通常与本体IRI相关

如果您只想得到字符串“aqua”,那么有两个选项。第一种(也是首选的)方法是检索类的rdfs:label(如果它有),它应该是类的字符串名称。如果由于某种原因,这不起作用,您可以获取URI的字符串值并去掉前缀的字符串值。以下是DBpedia SPARQL端点上两种方法的示例:

选择“类别”标签的位置{
a类猫头鹰:类;rdfs:标签?标签
筛选器语言匹配(语言(?标签),'en')
}
限制10

选择类名称,其中{
?a级猫头鹰:a级猫头鹰
绑定(strafter(str(?class),str(dbpedia owl:)作为?名称)
}
限制10


一般来说,为了显示目的而去掉URI的前缀不是推荐的做法,因为它假定URI具有人类可读的形式。在DBPedia的情况下,这种方法正好可以工作,但是很多数据集都有带有内部代码的URI,而不是人类可读的名称。因此,如果
rdfs:label
(明确定义为资源的可读表示形式)可用,您应该尝试并始终使用它

像往常一样非常彻底。另一个备注:应注意,通常情况下,为了显示目的而去除IRI的前缀不是推荐的做法,因为它假定IRI具有人类可读的形式。在DBPedia的例子中,这种方法正好有效,但很多数据集都有带有内部代码的IRIs,而不是人类可读的名称。因此,如果
rdfs:label
(明确定义为人类可读的资源表示形式)可用,您应该尝试并始终使用它。@JeenBroekstra同意。看起来OP使用的是Protege,虽然最新版本可能采用用户提供的名称并自动创建rdfs:label,但早期版本只是将名称与本体IRI连接起来。如果是这样,那么前缀剥离版本将更有用。也就是说,我同意rdfs:label版本是更好的实践,因为虹膜应该被视为不透明的。非常感谢。然而,第二个解决方案对我不起作用!经过所有的更改和努力,它出现了一个错误“未知函数strafter…”。但标签很好。@zafy strafter在SPARQL 1.1中提供。如果您使用的是第一个版本(SPARQL 1.0),则需要使用正则表达式。