【问题标题】:sparql query in dotNetRDFdotNetRDF 中的 sparql 查询
【发布时间】:2015-05-28 04:17:28
【问题描述】:

我已经通过 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());
   }
 }

【问题讨论】:

    标签: c# rdf sparql dotnetrdf


    【解决方案1】:

    请参阅 Querying with SPARQL 文档,特别是 Common Errors 上的部分:

    查询的一个常见错误是默认查询 通常仅对商店中未命名的默认图进行操作 (取决于您的查询处理器)。因此执行查询可能 不产生任何结果,具体取决于您的数据所在的图表以及是否 您正确配置了数据集。请参阅 SPARQL 数据集 用于讨论配置不同类型数据集的页面。你 还可以查看 Debugging SPARQL Queries 以获取调试内容的方法 使用内存中 SPARQL 引擎时,您的查询正在发生。

    这种情况的典型原因是当您调用 LoadFromFile() 或 LoadFromUri() 库自动为图形分配一个基于名称 在数据源上,因此当您将其添加为商店实例时,它是一个命名的 图表而不是默认图表。解决此问题的最简单方法 是简单地将图形实例的 BaseUri 属性设置为 null 在加载它之后,在你用它执行查询之前。

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

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

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

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

    或者,您也可以通过创建query processor 和数据集来完全避免使用已弃用的方法,该数据集可让您直接控制将哪个图形用作默认值:

    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");
    

    【讨论】:

    • 我认为这个答案更有帮助,非常感谢 RobV
    • 我打算在 Web 应用程序中读取和查询 rdf 类型本体,如果我在我的项目中添加一个 .cs 类,我是否能够做到这一点?
    【解决方案2】:

    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
    }
    

    您编写的查询在 object 位置有 pizza:MushroomTopping。幸运的是,在这种情况下这可能更有意义,因为 pizza:MushroomTopping 是 OWL class,而不是属性,因此您不太可能看到它出现在谓词位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多