3

我正在尝试使用 pyrdf 和 sparql 过滤海龟文件。但我注意到 sparql 查询丢失了元素上下文的信息。然后我想将查询结果重新打印为海龟文件,是否可以在不手动扫描元素的所有子字段的情况下做到这一点?我们有关于位置的数据,格式如下:

:pt0001
     vcard:category "Poste e Telegrafi"
    ; vcard:fn "Ufficio Bologna 1"
    ; vcard:extended-address "Via Cairoli 9, Bologna BO, Italy"
    ; vcard:latitude "44.504192"
    ; vcard:longitude "11.338661"
    ; vcard:tel "051 243425"
    ; vcard:fax "051 244459"
    ; cs:opening "Mon, Tue, Wed, Thu, Fri: 0800-1330. Sat: 0800-1230."
    ; cs:closing "01-01, 01-06, P, LA, 04-25, 05-01, 06-02, 08-15, 11-01, 12-08, 12-25, 12-26: .".

例如,我们只需要具有名称 (fn) 的位置。感谢您找到的任何提示...

4

1 回答 1

4

要取回所有具有名称的位置,您可以执行以下简单操作:

SELECT DISTINCT ?location
WHERE { 
   ?location vcard:fn [].
}

这将为您返回标识符(:pt0001在您的示例中),但当然查询也可以适应返回所有属性值。

编辑我根据您的说明添加了其他示例,我认为这就是您所追求的)

像这样:

SELECT ?location ?prop ?value
WHERE { 
   ?location vcard:fn [];
             ?prop ?value .
} ORDER BY ?location

此查询的结果将是以下形式的结果表:

?location    ?prop           ?value
:pt0001      vcard:category  "Poste e Telegrafi"
:pt0001      vcard:name      "Ufficio Bologna 1"
:pt0001      vcard:tel       "051 243425"
(etc...)   

或者,作为另一种选择,您可以明确制定查询以获取每个位置的特定属性值:

SELECT ?location ?name ?cat ?tel
WHERE { 
   ?location vcard:fn ?name ;
             vcard:category ?cat ;
             vcard:tel ?tel .
} ORDER BY ?location

这将为您提供以下形式的结果表:

?location ?name               ?cat                ?tel
:pt0001   "Ufficio Bologna 1" "Poste e Telegrafi" "051 243425"

任你选。

SPARQL 查询的诀窍是考虑三元组。您的数据包含主谓宾三元组,SPARQL 查询在这些三元组上制定模式。

作为进一步的评论:我看到您正在考虑将查询结果重新打印为海龟。在这种情况下,CONSTRUCT 查询可能就是您所追求的。SELECT 查询的结果(如上所示)是一个表结构,而 CONSTRUCT 查询的结果是 RDF 三元组的集合:

 CONSTRUCT { ?subject ?predicate ?object }
 WHERE { 
   ?subject ?predicate ?object ;
            vcard:fn [] 
 }
于 2012-04-18T18:50:20.530 回答