dotnetrdf中的SPARQL查询不查询导入的本体

时间:2017-09-23 06:20:22

标签: c# sparql owl dotnetrdf

我要做的是在我使用Protege 5创建的owl文件中使用以下查询列出所有类,并将“foaf”作为导入的本体。

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT DISTINCT ?subject ?label ?comment
    WHERE 
    { 
        ?subject a owl:Class 
        OPTIONAL { ?subject a rdfs:Class }
        OPTIONAL { ?subject rdfs:label ?label }
        OPTIONAL { ?subject rdfs:comment ?comment}
    }

问题是,当我在Protege的SPARQL选项卡中运行此查询时,我得到“foaf”命名空间中定义的所有类,但是当我尝试在c#中使用dotnetrdf api运行相同的查询时,我得不到相同的结果。

以下是我在c#中的代码

var g = new Graph();
g.LoadFromFile(owlFile, new TurtleParser());
ISparqlDataset ds = new InMemoryDataset(g);
LeviathanQueryProcessor processor = new LeviathanQueryProcessor(ds);
var queryParser = new SparqlQueryParser();
var parmeterizedString = new SparqlParameterizedString(query);
parmeterizedString.SetLiteral("value", searchQuery);
return processor.ProcessQuery(queryParser.ParseFromString(parmeterizedString.ToString())) as SparqlResultSet;

我做错了什么?

1 个答案:

答案 0 :(得分:4)

仅解析文件不会导致遵循owl:imports语句。查询引擎不是OWL敏感的。

g.LoadFromFile(owlFile, new TurtleParser());

https://github.com/dotnetrdf/dotnetrdf/wiki/HowTo-Load-OWL

  

虽然dotNetRDF在公理方面不支持OWL,但OWL   本体论和推理

LoadFromFile读取编码本体的RDF语句。没有OWL级别的处理,包括处理owl:imports

您可以通过查找owl:imports语句并将链接读入g来模拟此情况。这并不完美,但从最初的描述来看,可能是想要的东西。