2013-05-01 87 views
4

所以我有一個包含許多「羣組」一個RDF Schema,並且每個組有一個「名稱」,幷包含了許多「元素」。我需要選擇每個組的名稱,以及每個組的元素數量。下面是一組RDF模式的一個樣本...使用GROUP BY,計數和阿帕奇耶拿SPARQL樣品

<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 

...但我會得到一個空的結果,我不知道爲什麼。我應該得到一個組名,與該組包含,在貓頭鷹文件中的每個組然而,許多元素一起。

回答

9

如果提供了一個最小的工作示例(例如,我們可以查詢完整的RDF數據集),回答這類問題就容易得多。例如,在上面,由於我們不知道文檔的XML基礎,我們不知道描述的個人是否實際上匹配?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,這裏是由阿帕奇耶拿的命令行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   | 
-------------------------------------------------- 
+0

嗯好吧,我想知道爲什麼我的查詢是返回g和空集,然後。這裏是整個數據集的網址http://www.daml.org/2003/01/periodictable/PeriodicTable.owl – MassStrike 2013-05-01 14:36:14

+0

@MassStrike我拉下了這個數據集幷包含了我的查詢結果。我認爲這是預期的。 – 2013-05-01 14:49:31

+0

確定了它的工作。感謝Joshua。 – MassStrike 2013-05-01 14:51:24