为什么我的 SPARQL 查询 return 资源的 URI 而不是它的名称?
Why does my SPARQL query return the URI of a resource instead of its name?
我想获得我 ontology 的所有 classes。这是我的 ontology 文件的一部分,格式为 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"/>
我写了这个查询,它在 Protege 中正常工作,但是当我在 dotNetRDF 中使用它时,它 returns class 的完整 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();
}
我期望的结果只是"aqua",但实际上是“http://www.w3.org/2002/07/owl#aqua”。为什么会发生这种情况,我该如何取回名称?
RDF 和 OWL 中的非匿名资源由 IRI 标识。您的 ontology 清楚地表明 http://www.w3.org/2002/07/owl#aqua 是 class。如果您要求class,那是您应该得到的。可能是 Protege 在 显示 结果时剥离了 http://www.w3.org/2002/07/owl# 部分,但结果实际上仍然是 IRI。
注意:您确实不应该定义其 IRI 以标准 OWL 命名空间开头的新 classes。您应该定义自己的前缀,通常与 ontology IRI 相关。
如果您只想获得字符串 "aqua" 作为结果,您有两种选择。第一种(也是首选)方法是检索 class 的 rdfs:label,如果有的话,应该是 class 的字符串名称.如果由于某种原因不起作用,您可以采用 URI 的字符串值并去除前缀的字符串值。以下是 DBpedia SPARQL 端点上两种方法的示例:
select ?class ?label where {
?class a owl:Class ; rdfs:label ?label
filter langMatches(lang(?label),'en')
}
limit 10
SPARQL results (with rdfs:label)
select ?class ?name where {
?class a owl:Class
bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10
SPARQL results (by stripping the prefix)
通常不推荐出于显示目的剥离 URI 的前缀,因为它假定 URI 具有人类可读的形式。在 DBPedia 的情况下,这恰好有效,但大量数据集的 URI 具有内部代码而不是人类可读的名称。因此,如果 rdfs:label
(明确定义为资源的人类可读表示)可用,您应该尝试并始终使用它。
我想获得我 ontology 的所有 classes。这是我的 ontology 文件的一部分,格式为 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"/>
我写了这个查询,它在 Protege 中正常工作,但是当我在 dotNetRDF 中使用它时,它 returns class 的完整 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();
}
我期望的结果只是"aqua",但实际上是“http://www.w3.org/2002/07/owl#aqua”。为什么会发生这种情况,我该如何取回名称?
RDF 和 OWL 中的非匿名资源由 IRI 标识。您的 ontology 清楚地表明 http://www.w3.org/2002/07/owl#aqua 是 class。如果您要求class,那是您应该得到的。可能是 Protege 在 显示 结果时剥离了 http://www.w3.org/2002/07/owl# 部分,但结果实际上仍然是 IRI。
注意:您确实不应该定义其 IRI 以标准 OWL 命名空间开头的新 classes。您应该定义自己的前缀,通常与 ontology IRI 相关。
如果您只想获得字符串 "aqua" 作为结果,您有两种选择。第一种(也是首选)方法是检索 class 的 rdfs:label,如果有的话,应该是 class 的字符串名称.如果由于某种原因不起作用,您可以采用 URI 的字符串值并去除前缀的字符串值。以下是 DBpedia SPARQL 端点上两种方法的示例:
select ?class ?label where {
?class a owl:Class ; rdfs:label ?label
filter langMatches(lang(?label),'en')
}
limit 10
SPARQL results (with rdfs:label)
select ?class ?name where {
?class a owl:Class
bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10
SPARQL results (by stripping the prefix)
通常不推荐出于显示目的剥离 URI 的前缀,因为它假定 URI 具有人类可读的形式。在 DBPedia 的情况下,这恰好有效,但大量数据集的 URI 具有内部代码而不是人类可读的名称。因此,如果 rdfs:label
(明确定义为资源的人类可读表示)可用,您应该尝试并始终使用它。