rdf - 在 apache jena SPARQL 中使用 GROUP BY、COUNT 和 SAMPLE

标签 rdf sparql semantic-web jena owl

所以我有一个包含许多“组”的 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 数据集),那么回答这些类型的问题就会容易得多。例如,在上面,由于我们不知道文档的 XML 库,我们无法知道 <Group rdf:ID="group_actinoid">...</Group> 所描述的个体是否存在。实际上会匹配模式 ?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         |
--------------------------------------------------

关于rdf - 在 apache jena SPARQL 中使用 GROUP BY、COUNT 和 SAMPLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311670/

相关文章:

java - Snap SPARQL API 是否存在?

sparql - 通过 Jena 命令行进行多个 SPARQL 查询

rdf - 微格式、rdf 或微数据

java - 使用 xml 文件中的 jena 创建 RDF 三元组和 RDF 存储

Python 和 rdflib : parsing issues

c++ - librdf 编译错误,未定义对 raptor_new_world_internal 的引用'

sparql - 查询获取维基数据页面中的前 3 张图像

java - 从 SPARQL 结果中的文字中删除数据类型

rdf - 在现实世界的应用程序中使用语义Web技术的示例

jena - 将 SWRL 与 Jena 和 Pellet 结合使用