%META:TOPICPARENT{name="VirtTipsAndTricksGuide"}%
---+How Can I Get an exact mapping for a date?
Assume a given attempts to get an exact mapping for the literal "1950" using bif:contains:
SPARQL
SELECT DISTINCT ?s ?o
FROM
WHERE
{
?s ?p ?o .
FILTER( bif:contains (?o, '"1950"')
&& isLiteral(?o)
&& ( str(?p) ! = rdfs:label || str(?p) != foaf:name
&& ( ?o='1950')
)
}
As an integer 1950 or date 1950-01-01 are not texts, they are not in
free-text index and thus invisible for CONTAINS free-text predicate.
A possible way to make them visible that way is to introduce an
additional RDF predicate that will contain objects of the triples in question,
converted to strings via str() function.
Thus better results will be approached: if searches about dates are frequent then a
new predicate can have date/datetime values extracted from texts, eliminating the need for bif:contains.
Therefor, the query from above should be changed to:
SPARQL
SELECT DISTINCT ?s ?o
FROM
WHERE
{
?s ?p ?o .
FILTER ( isLiteral(?o)
&& ( str(?p) != str(rdfs:label) || str(?p) != foaf:name )
&& str(?o) in ("1950", "1950-01-01"))
}
---+++Related
* [[VirtTipsAndTricksGuide][Virtuoso Tips and Tricks Collection]]
* [[http://docs.openlinksw.com/virtuoso/rdfsparql.html][SPARQL]]