使用rdflib和sparql查询过滤n3 / turtle文件
作者:互联网
我正在尝试使用带有sparql的pyrdf筛选乌龟文件.但是我注意到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)的位置.
感谢您发现的任何提示…
解决方法:
要获取所有具有名称的位置,可以执行以下简单操作:
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查询在这些三元组上制定模式.
进一步说明:我看到您正在考虑将查询结果重新打印为turtle.在这种情况下,您可能需要使用CONSTRUCT查询.尽管SELECT查询的结果(如上所示)是表结构,但CONSTRUCT查询的结果是RDF三元组的集合:
CONSTRUCT { ?subject ?predicate ?object }
WHERE {
?subject ?predicate ?object ;
vcard:fn []
}
标签:sparql,rdf,rdflib,python 来源: https://codeday.me/bug/20191101/1983598.html