【问题标题】:Using GROUP BY, COUNT and SAMPLE in apache jena SPARQL在 apache jena SPARQL 中使用 GROUP BY、COUNT 和 SAMPLE
【发布时间】:2013-05-01 01:56:08
【问题描述】:

所以我有一个包含许多“组”的 RDF 模式,每个组都有一个“名称”,并包含许多“元素”。我需要选择每个组的名称,以及每个组的元素数量。这是一个组 RDF 模式的示例...

<Group rdf:ID="group_actinoid">
    <name rdf:datatype="&xsd;string">Actinoid</name>
    <element rdf:resource="#Ac"/>
    <element rdf:resource="#Th"/>
    <element rdf:resource="#Pa"/>
    <element rdf:resource="#U"/>
    <element rdf:resource="#Np"/>
    <element rdf:resource="#Pu"/>
    <element rdf:resource="#Am"/>
    <element rdf:resource="#Cm"/>
    <element rdf:resource="#Bk"/>
    <element rdf:resource="#Cf"/>
    <element rdf:resource="#Es"/>
    <element rdf:resource="#Fm"/>
    <element rdf:resource="#Md"/>
    <element rdf:resource="#No"/>
</Group>

...这是我一直试图开始工作的查询...

  1 PREFIX pt:<http://www.daml.org/2003/01/periodictable/PeriodicTable#>
  2 PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
  3 PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
  4 PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
  5
  6 SELECT (SAMPLE(?name) AS ?NAME) (COUNT(?elem) AS ?ELEMENTCOUNT)
  7 WHERE {
  8         ?group rdf:type pt:Group .
  9         ?group pt:name ?name .
 10         ?elem pt:element ?group .
 11       }
 12 GROUP BY ?group

...但是我得到一个空的结果,我不确定为什么。我应该为 owl 文件中的每个组获取一个组名,以及该组包含的许多元素。

【问题讨论】:

    标签: rdf sparql semantic-web jena owl


    【解决方案1】:

    如果提供了一个最小的工作示例(例如,我们可以查询的完整 RDF 数据集),那么回答这类问题会容易得多。例如,在上面,由于我们不知道文档的 XML 库,我们无法知道 &lt;Group rdf:ID="group_actinoid"&gt;...&lt;/Group&gt; 描述的个体是否真的会匹配模式 ?group rdf:type pt:Group

    这里有一些基于你的数据,但其中包含另一个组,以便我们可以看到分组和聚合:

    @prefix pt: <http://www.daml.org/2003/01/periodictable/PeriodicTable#> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#>.
    
    pt:actinoid
      a pt:Group ;
      pt:name "Actinoid" ;
      pt:element pt:Ac ;
      pt:element pt:Th ;
      pt:element pt:Pa ;
      pt:element pt:U ;
      pt:element pt:Np ;
      pt:element pt:Pu ;
      pt:element pt:Am ;
      pt:element pt:Cm ;
      pt:element pt:Bk ;
      pt:element pt:Cf ;
      pt:element pt:Es ;
      pt:element pt:Fm ;
      pt:element pt:Md ;
      pt:element pt:No .
    
    pt:beatles
      a pt:Group ;
      pt:name "Beatles" ;
      pt:element pt:John ;
      pt:element pt:Paul ;
      pt:element pt:George ;
      pt:element pt:Ringo .
    

    这是一个与您的非常相似的 SPARQL 查询(尽管我尽可能使用了一些较短的形式),并将交换的 ?element pt:element ?group 更正为 ?group pt:element ?element。通过这个 SPARQL 查询,我们可以得到听起来像您正在寻找的各种结果。

    PREFIX pt:<http://www.daml.org/2003/01/periodictable/PeriodicTable#>
    PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
    PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX xsd:<http://www.w3.org/2001/XMLSchema#>
    SELECT (SAMPLE(?name) AS ?NAME) (COUNT(?element) as ?NELEMENTS)
    WHERE {
      ?group a pt:Group ;
             pt:name ?name ;
             pt:element ?element .
    }
    GROUP BY ?group 
    

    调用数据groups.n3和查询groups.sparql,下面是Apache Jena命令行ARQ产生的结果:

    $ /usr/local/lib/apache-jena-2.10.0/bin/arq  --data groups.n3 --query groups.sparql
    --------------------------
    | NAME       | NELEMENTS |
    ==========================
    | "Beatles"  | 4         |
    | "Actinoid" | 14        |
    --------------------------
    

    当我对http://www.daml.org/2003/01/periodictable/PeriodicTable.owl 的数据运行相同的查询时(下载并保存为PeriodicTable.owl 后),我得到如下所示的名称和计数:

    $ /usr/local/lib/apache-jena-2.10.0/bin/arq \
          --data ~/Downloads/PeriodicTable.owl \
          --query groups.sparql
    --------------------------------------------------
    | NAME                               | NELEMENTS |
    ==================================================
    | "Lanthanoid"^^xsd:string           | 14        |
    | "Noble gas"^^xsd:string            | 7         |
    | "Halogen"^^xsd:string              | 6         |
    | "Actinoid"^^xsd:string             | 14        |
    | "Chalcogen"^^xsd:string            | 6         |
    | "Pnictogen"^^xsd:string            | 6         |
    | "Coinage metal"^^xsd:string        | 4         |
    | "Alkali metal"^^xsd:string         | 7         |
    | "Alkaline earth metal"^^xsd:string | 6         |
    --------------------------------------------------
    

    【讨论】:

    • 嗯,好吧,我想知道为什么我的查询返回并且为空集。这是完整数据集的 URL daml.org/2003/01/periodictable/PeriodicTable.owl
    • @MassStrike 我拉下了那个数据集并包含了我的查询结果。我认为这是预期的结果。
    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2015-10-30
    • 2016-07-23
    相关资源
    最近更新 更多