Reputation: 83
I am trying to filter a turtle file using pyrdf with sparql. But I noticed that sparql queries lose information over the context of the elements. I would like then to re-print the result of the query as a turtle file, is it possible to do this without manually scanning all the subfields of the element? We have data about locations formatted like this:
: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: .".
For example we want only locations that have a name (fn). Thanks for any tip you find...
Upvotes: 3
Views: 921
Reputation: 22052
To get back all locations which have a name, you could do something simple like:
SELECT DISTINCT ?location
WHERE {
?location vcard:fn [].
}
This will give you back back the identifier (:pt0001
in your example), but of course the query can be adapted to return all the property values as well.
(Edit I added additional examples based on your clarification, I think this is what you're after)
Like so:
SELECT ?location ?prop ?value
WHERE {
?location vcard:fn [];
?prop ?value .
} ORDER BY ?location
The result of this query will be a table of results of the form:
?location ?prop ?value
:pt0001 vcard:category "Poste e Telegrafi"
:pt0001 vcard:name "Ufficio Bologna 1"
:pt0001 vcard:tel "051 243425"
(etc...)
Or, as yet another alternative, you can explicitly formulate your query to get specific property values for each location:
SELECT ?location ?name ?cat ?tel
WHERE {
?location vcard:fn ?name ;
vcard:category ?cat ;
vcard:tel ?tel .
} ORDER BY ?location
which will give you back a result table of the form:
?location ?name ?cat ?tel
:pt0001 "Ufficio Bologna 1" "Poste e Telegrafi" "051 243425"
Take your pick.
The trick with SPARQL queries is to think in terms of triples. Your data contains subject-predicate-object triples, SPARQL queries formulate patterns over those triples.
As a further remark: I see you are thinking about re-printing the result of the query as turtle. In that case, a CONSTRUCT query might be what you're after. While the result of a SELECT query (as shown above) is a table structure, the result of a CONSTRUCT query is a collection of RDF triples:
CONSTRUCT { ?subject ?predicate ?object }
WHERE {
?subject ?predicate ?object ;
vcard:fn []
}
Upvotes: 4