我已经通过曼彻斯特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());
}
}发布于 2015-05-28 08:27:58
请参阅查询SPARQL文档,特别是关于常见错误的一节,其中说:
进行查询的一个常见错误是,默认情况下,查询通常只在存储区中未命名的默认图上操作(取决于查询处理器)。因此,执行查询可能不会产生任何结果,这取决于数据在哪些图形中,以及您是否正确地配置了数据集。有关配置不同类型数据集的讨论,请参见SPARQL数据集页面。您还可以查看调试SPARQL查询的方法,以便在使用内存中SPARQL引擎时调试查询中发生的情况。 的典型原因是,当调用LoadFromFile()或LoadFromUri()时,库会根据数据源自动为图形分配名称,因此当您将图形添加为存储实例时,它是一个命名图,而不是默认图。解决这一问题的最简单方法是,在加载图形实例之后并在使用它执行查询之前,将图形实例的BaseUri属性设置为null。
强调是我的,因为这准确地描述了在你的情况下正在发生的事情。加载的图形根据它来自的文件给出一个名称,命名图也是如此,存储的默认图仍然是空的。
还请注意,由于这个问题,您使用的ExecuteQuery()方法是特别不推荐的,并且您会收到关于使用过时方法的编译器警告。这种方法可能会在以后的版本中被删除,因此应该避免。
有两种方法可以修复这个问题,首先,正如上面引用的文档中所指出的,我们可以从图中删除名称,以便将其视为默认图:
Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
g.BaseUri = null;
store.Add(g);或者,您也可以通过创建一个查询处理器和dataset来避免完全使用不推荐的方法,该数据集使您可以直接控制使用哪个图作为默认值:
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-28 12:10:15
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> .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三元组是形式(subject、谓词、object)。当您编写SPARQL查询时,您将编写:
select ?subject ?predicate ?object where {
?subject ?predicate ?object
}您编写的查询的对象位置有pizza:MushroomTopping。幸运的是,在这种情况下,这可能更有意义,因为pizza:MushroomTopping是OWL类,而不是属性,所以您很难看到它出现在谓词位置。
https://stackoverflow.com/questions/30497174
复制相似问题