首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dotNetRDF中的sparql查询

dotNetRDF中的sparql查询
EN

Stack Overflow用户
提问于 2015-05-28 04:17:28
回答 2查看 3.6K关注 0票数 3

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

代码语言:javascript
复制
 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());
   }
 }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-28 08:27:58

请参阅查询SPARQL文档,特别是关于常见错误的一节,其中说:

进行查询的一个常见错误是,默认情况下,查询通常只在存储区中未命名的默认图上操作(取决于查询处理器)。因此,执行查询可能不会产生任何结果,这取决于数据在哪些图形中,以及您是否正确地配置了数据集。有关配置不同类型数据集的讨论,请参见SPARQL数据集页面。您还可以查看调试SPARQL查询的方法,以便在使用内存中SPARQL引擎时调试查询中发生的情况。 的典型原因是,当调用LoadFromFile()或LoadFromUri()时,库会根据数据源自动为图形分配名称,因此当您将图形添加为存储实例时,它是一个命名图,而不是默认图。解决这一问题的最简单方法是,在加载图形实例之后并在使用它执行查询之前,将图形实例的BaseUri属性设置为null。

强调是我的,因为这准确地描述了在你的情况下正在发生的事情。加载的图形根据它来自的文件给出一个名称,命名图也是如此,存储的默认图仍然是空的。

还请注意,由于这个问题,您使用的ExecuteQuery()方法是特别不推荐的,并且您会收到关于使用过时方法的编译器警告。这种方法可能会在以后的版本中被删除,因此应该避免。

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

代码语言:javascript
复制
Graph g = new Graph();
g.LoadFromFile(@"C:\pizza.rdf");
g.BaseUri = null;
store.Add(g);

或者,您也可以通过创建一个查询处理器和dataset来避免完全使用不推荐的方法,该数据集使您可以直接控制使用哪个图作为默认值:

代码语言:javascript
复制
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");
票数 3
EN

Stack Overflow用户

发布于 2015-05-28 12:10:15

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

代码语言:javascript
复制
PREFIX pizza:<http://example.org/>
SELECT *  WHERE {
  ?X ?Y pizza:MushroomTopping .
}

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

代码语言:javascript
复制
<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中运行了这个程序,所以结果可能看起来有点不同):

代码语言:javascript
复制
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?s ?p {
  ?s ?p pizza:MushroomTopping
}
代码语言:javascript
复制
-------------------------------------------------------------------------------
| 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查询时,您将编写:

代码语言:javascript
复制
select ?subject ?predicate ?object where {
  ?subject ?predicate ?object
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30497174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档