首页 文章

使用SPARQL获取rdf:list的计数

提问于
浏览
7

这是获取rdf:list中项目计数的正确/最佳SPARQL查询:

select(COUNT(?a)AS?count)其中{?a http://www.w3.org/1999/02/22-rdf-syntax-ns#first?c}

在此先感谢您的帮助 .

问候,拉胡尔

2 回答

  • 4

    有趣的问题,因为它似乎很简单,但很难正确表达查询 . William Greenly's answer没有提供你想要的东西,尽管他的解释完全正确并正确地使用property path . 为了能够正确地询问回答您问题的正确查询,必须假设所有列表都是格式良好的(它们只有一个第一个元素,一个休息,它们以零结尾) .

    您的查询中的问题是它将计算数据集中所有列表的所有成员 . 您需要将 rdf:first 与仅一个列表的元素相关联 .

    如果您有一个标识您感兴趣的列表的URI,则可以执行以下操作:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
    PREFIX ex:  <http://www.example.org/#>
    SELECT (COUNT(?member) AS ?count) 
    WHERE {
      ex:uriOfTheList  rdf:rest*/rdf:first  ?member
    }
    

    但通常,列表不是由URI标识的 . 在这种情况下,可以通过使用其他属性来识别某些列表 . 例如,假设您有一个 ex:listOfAuthors 属性,您可以这样做:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX ex:  <http://www.example.org/#>
    SELECT (COUNT(?member) AS ?count) 
    WHERE {
      ex:publication  ex:listOfAuthors  ?list .
      ?list  rdf:rest*/rdf:first  ?member .
    }
    

    请注意,如果你只是这样做:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    SELECT (COUNT(?member) AS ?count) 
    WHERE {
      ?list  rdf:rest*/rdf:first  ?member .
    }
    

    你会加上所有大小的列表 and sublists . 现在事情变得复杂如果你没有URI,也许你想得到每个列表的所有列表的计数 . 有一种方法可行:

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    SELECT (COUNT(?c) AS ?count) 
    WHERE {
      ?thing  !rdf:rest  ?list .
      ?list  rdf:rest*/rdf:first  ?member .
    }
    

    这说的是我们想要找到连接到列表的东西,但不能找到谓词 rdf:rest . 原则上,只有列表的开头通过谓词连接到某个其他实体,如果实体本身不是列表且谓词不是 rdf:rest . 此外,列表通常总是以某种方式与其他实体连接,因为没有必要独立于其他实体来描述列表 .

  • 3

    这实际上是一个非常好的问题,因为它不是一个特别简单的解决方案 .

    RDF列表中的重要术语是:

    rdf:first 
    rdf:rest 
    rdf:nil
    

    对于多个项目的列表,建议您按如下方式建模:

    a:a rdf:first a:b;
        rdf:rest [
           rdf:first a:c;
           rdf:rest rdf:nil.
        ].
    

    使用rdf:nil表示列表不再有任何项目(所以基本上它是列表列表) . 但是它也说明你可以使用rdf:首先如下:

    a:a rdf:first a:b;
        rdf:first a:c;
        rdf:rest rdf:nil.
    

    rdf:nil的要点是指定列表不再包含任何项目 . 请记住,语义Web是基于开放世界的假设,所以除非另有说明,否则你不能假设列表没有更多的项目只是因为它们不为人所知或已经说明,因此需要个人,rdf:nil .

    幸运的是,在上面的示例中,两者都有一个查询,它依赖于支持SPARQL 1.1的处理器 .

    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>  
    SELECT (COUNT(?a) AS ?count) 
    WHERE {?a rdf:first+ ?c}
    

    记住,除非列表包含rdf:nil,否则不要认为它是完整的 .

相关问题