Mas*_*ike 4 rdf semantic-web owl sparql jena
所以我有一个包含许多"组"的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>
Run Code Online (Sandbox Code Playgroud)
......这是我一直试图开始工作的问题......
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
Run Code Online (Sandbox Code Playgroud)
...但我得到一个空洞的结果,我不确定为什么.我应该为owl文件中的每个组获取一个组名,以及组中包含的许多元素.
Jos*_*lor 10
如果提供最小的工作示例(例如,我们可以查询的完整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 .
Run Code Online (Sandbox Code Playgroud)
这里有一个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
Run Code Online (Sandbox Code Playgroud)
调用数据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 |
--------------------------
Run Code Online (Sandbox Code Playgroud)
当我在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 |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)