3

我已经通过 Manchester OWL 语法转换器将众所周知的pizza.owl本体转换为 RDF 文件。pizza.rdf我已经编写了这段代码,但我没有得到任何结果,但也没有错误。如何获得带有谓词的三元组MushroomTopping

 TripleStore store = new TripleStore();
 store.LoadFromFile(@"C:\pizza.rdf");
 Object results = store.ExecuteQuery("PREFIX pizza:<http://example.org/> SELECT *  WHERE { ?X ?Y pizza:MushroomTopping  . }
 if (results is SparqlResultSet)
 {
   //Print out the Results
   //Console.WriteLine("working up to this ");
   SparqlResultSet rset = (SparqlResultSet)results;
   foreach (SparqlResult result in rset.Results)
   {
     Console.WriteLine(result.ToString());
   }
 }
4

2 回答 2

3

请参阅Querying with SPARQL文档,特别是常见错误部分,其中说:

进行查询的一个常见错误是,默认情况下查询通常仅在存储中未命名的默认图上运行(取决于您的查询处理器)。因此,根据您的数据所在的图表以及您是否正确配置数据集,执行查询可能不会产生任何结果。有关配置不同类型数据集的讨论,请参阅 SPARQL 数据集页面。您还可以查看调试 SPARQL 查询,以了解在使用内存 SPARQL 引擎时调试查询发生的情况的方法。

造成这种情况的典型原因是,当您调用 LoadFromFile() 或 LoadFromUri() 时,库会根据数据源自动为图分配一个名称,因此当您将其添加为存储实例时,它是一个命名图而不是默认图。解决此问题的最简单方法是在加载图形实例之后和使用它执行查询之前将其设置为 null。

添加的重点是我的,因为这准确描述了您的情况。加载的图根据它来自的文件被命名,命名图也是如此,并且商店的默认图保持为空。

另请注意,ExecuteQuery()由于此问题,您使用的方法已被特别弃用,并且您会收到有关使用过时方法的编译器警告。此方法可能会在将来的版本中删除,因此应避免使用。

有两种方法可以解决这个问题,首先如上面引用的文档中所述,我们可以从图中删除名称,以便将其视为默认图:

Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
g.BaseUri = null;
store.Add(g);

或者,您可以通过创建查询处理器和数据集来完全避免使用已弃用的方法,从而直接控制将哪个图用作默认值:

Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
ISparqlDataset ds = new InMemoryDataset(g);
LeviathanQueryProcessor processor = new LeviathanQueryProcessor(ds);
Object results = processor.ProcessQuery("# Your query");
于 2015-05-28T08:27:58.047 回答
0

RobV 的答案很重要,你最终可能会遇到它,但我认为最有可能的问题是你在查询中的前缀是错误的。这是您的查询:

PREFIX pizza:<http://example.org/>
SELECT *  WHERE {
  ?X ?Y pizza:MushroomTopping .
}

但是,如果您查看数据中的一些三元组,您会看到,例如:

<http://www.co-ode.org/ontologies/pizza/pizza.owl#RocketTopping> <http://www.w3.org/2002/07/owl#disjointWith> <http://www.co-ode.org/ontologies/pizza/pizza.owl#MushroomTopping> .

Pizza:前缀应该是http://www.co-ode.org/ontologies/pizza/pizza.owl#。如果你做出改变,那么你可能会得到更有意义的结果,比如这些(但我在 Jena 中运行了这个,所以结果可能看起来有点不同):

prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?s ?p {
  ?s ?p pizza:MushroomTopping
}
-------------------------------------------------------------------------------
| s                      | p                                                  |
===============================================================================
| _:b0                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:CaperTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:PepperTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b1                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| pizza:RocketTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b2                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| _:b3                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OnionTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b4                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| _:b5                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| pizza:TomatoTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:GarlicTopping    | <http://www.w3.org/2002/07/owl#disjointWith>       |
| _:b6                   | <http://www.w3.org/2002/07/owl#someValuesFrom>     |
| _:b7                   | <http://www.w3.org/1999/02/22-rdf-syntax-ns#first> |
| pizza:OliveTopping     | <http://www.w3.org/2002/07/owl#disjointWith>       |
| pizza:ArtichokeTopping | <http://www.w3.org/2002/07/owl#disjointWith>       |
-------------------------------------------------------------------------------

如何使用谓词 MushroomTopping 获得三元组?

请注意,RDF 三元组的形式是(主语、谓语、宾语)。当你写一个 SPARQL 查询时,你会写:

select ?subject ?predicate ?object where {
  ?subject ?predicate ?object
}

您编写的查询在对象位置有Pizza:MushroomTopping 。幸运的是,在这种情况下,这可能更有意义,因为Pizza:MushroomTopping是一个 OWL,而不是一个属性,所以你不太可能看到它出现在谓词位置。

于 2015-05-28T12:10:15.570 回答