How to add dot '.' in the name of individuals in Sparql? - sparql

Is it possible to have a . (dot) in the qname of individuals or RDF resources in general?
Something like this?
SELECT ?tableName ?fieldName
WHERE { ?fieldName hrdata:relatedField hrdata:ps_ti0002.EMPLID. }
The dot in ps_ti0002.EMPLID is problematic.

your code is right and should work. It is possible to use dot in the individual's name.
I think you should check your data property (relatedField), maybe is not clarified right.

#Narges Kasaeizadeh
Unfortunately, I still can't comment - but I think your answer is wrong and a dot is not allowed in prefixed URIs/IRIs as you can try out using the validator suggested by #AndyS .

The . is allowed in SPARQL and the SPARQLer Query Validator demonstrates. However, there are a couple of suggestions to help you get this working. First is to have a space after the qname, i.e.:
WHERE { ?fieldName hrdata:relatedField hrdata:ps_ti0002.EMPLID . }
Another is to use the fully qualified URI. Suppose the namespace for hrdata is http://example.org/hrdata/, the the following query should work:
SELECT ?tableName ?fieldName
WHERE { ?fieldName hrdata:relatedField <http://example.org/hrdata/ps_ti0002.EMPLID> . }

Related

SPARQL 1.0 - how to apply EXSLT functions in Mulgara

I would like to query a Fedora 3.8.1-based Mulgara triple store and apply an EXSLT string function to the results. The Mulgara documentation[1,2] suggests that the EXSLT[3] functions are builtin, but I'm not sure about the required syntax for accessing them. I've tried declaring the EXSLT namespace as a PREFIX, using the default QName representation, as well as using the full namespace as a URI. The following query is as close as I've been able to get, but it only returns false.
Any advice or suggestions would be greatly appreciated. Thanks for your help.
PREFIX fedora-view: <info:fedora/fedora-system:def/view#>
PREFIX exsl-str: <http://exslt.org/strings>
SELECT ?distincts
FROM <#ri>
WHERE {
?pid fedora-view:disseminates ?dsids .
LET ( ?distincts := str:replace(str(?dsids), "^(info:fedora).*$", "$1"))
}
In this contrived example, the returns would look like:
info:fedora
info:fedora
info:fedora
instead of:
info:fedora/pid:1/TN
info:fedora/pid:35/TECHMD
info:fedora/pid:46/RELS-EXT
[1] https://code.mulgara.org/projects/mulgara/wiki/Functions
[2] https://code.mulgara.org/projects/mulgara/wiki/SPARQLExt
[3] http://exslt.org/

How to compare values, ignoring diacritics, with SPARQL

I've been trying (with no success so far) to filter values with a "broader equals" condition. That is, ignoring diacritics.
select * where {
?s per:surname1 ?t.
bind (fn:starts-with(str(?t),'Maria') as ?noAccent1) .
bind (fn:translate(str(?t),"áéíóú","aeiou") as ?noAccent2) .
} limit 100
To this moment, I've tried with XPath functions fn:contains, fn:compare, fn:translate, fn:starts-with, but none of them seem to be working.
Is there any other way (other than chaining replaces) to add collation into these functions or achieve the same goal?
The XPath functions you mention are not part of the SPARQL standard really, so as you found out, you can't rely on them being supported out of the box (though some vendors may provide them as an add-on).
However, GraphDB (which is based on RDF4J) allows you to create your own custom functions in SPARQL. It is a matter of writing a Java class that implements the org.eclipse.rdf4j.query.algebra.evaluation.function.Function interface, and registering it in the RDF4J engine by packaging it as a Java Service Provider Interface (SPI) implementation.
SPARQL and REGEX do not support efficiently transliterating character maps. If you want an efficient implementation you would need a custom RDF4J custom as described by Jeen.
If you want a quick and dirty solution use this code sample:
PREFIX fn: <http://www.w3.org/2005/xpath-functions#>
PREFIX spif: <http://spinrdf.org/spif#>
select * where {
BIND("Mariana" as ?t) .
BIND("Márénísótú" as ?t2) .
BIND (regex(str(?t),'^Maria') as ?noAccent1) .
BIND (spif:replaceAll(
spif:replaceAll(
spif:replaceAll(
spif:replaceAll(
spif:replaceAll(str(?t2),"á","a"),
"é","e")
,"í","i"),
"ó","o"),
"ú","u") as ?noAccent2) .
}

Path queries in Wikidata endpoint?

Consider the following snippet
ASK WHERE { wd:Q734774 wdt:P31 wd:Q3918. }
This works fine in Wikidata. I want to use some of the path syntax in the this snippet. Specifically I want to limit the number of the times "wdt:P31" used in the path. According to the guidelines this should be the right syntax:
ASK WHERE { wd:Q734774 wdt:P31{,3} wd:Q3918. }
But it's giving me weird error messages. Any ideas?
The final version of SPARQL 1.1 Property Paths lets you do this with the following query --
ASK WHERE
{ wd:Q734774
wdt:P31? / wdt:P31? / wdt:P31?
wd:Q3918
}
For clarity, I've put the full Property Path Predicate (wdt:P31? / wdt:P31? / wdt:P31?) on a separate line between Subject (wd:Q734774) and Object (wd:Q3918). The trailing ? asks for one-or-zero instances of the wdt:P31 predicate, and the / asks for a sequence, so this full path asks for a sequence of zero-or-one-or-two-or-three instances.

How Do I Query Against Data.gov

I am trying to teach myself this weekend how to run API queries against a data source in this case data.gov. At first I thought I'd use a simple SQL variant, but it seems in this case I have to use SPARQL.
I've read through the documentation, downloaded Twinkle, and can't seem to quite get it to run. Here is an example of a query I'm running. I'm basically trying to find all gas stations that are null around Denver, CO.
PREFIX station: https://api.data.gov/nrel/alt-fuel-stations/v1/nearest.json?api_key=???location=Denver+CO
SELECT *
WHERE
{ ?x station:network ?network like "null"
}
Any help would be very much appreciated.
SPARQL is a graph pattern language for RDF triples. A query consists of a set of "basic graph patterns" described by triple patterns of the form <subject>, <predicate>, <object>. RDF defines the subject and predicate with URI's and the object is either a URI (object property) or literal (datatype or language-tagged property). Each triple pattern in a query must therefore have three entities.
Since we don't have any examples of your data, I'll provide a way to explore the data a bit. Let's assume your prefix is correctly defined, which I doubt - it will not be the REST API URL, but the URI of the entity itself. Then you can try the following:
PREFIX station: <http://api.data.gov/nrel...>
SELECT *
WHERE
{ ?s station:network ?network .
}
...setting the PREFIX to correctly represent the namespace for network. Then look at the binding for ?network and find out how they represent null. Let's say it is a string as you show. Then the query would look like:
PREFIX station: <http://api.data.gov/nrel...>
SELECT ?s
WHERE
{ ?s station:network "null" .
}
There is no like in SPARQL, but you could use a FILTER clause using regex or other string matching features of SPARQL.
And please, please, please google "SPARQL" and "RDF". There is lots of information about SPARQL, and the W3C's SPARQL 1.1 Query Language Recommendation is a comprehensive source with many good examples.

how to exclude one instance from SPARQL query result

I have a query to get some similar instances for a specific instance, which is owbes:Dies_Irae instance. This is the query:
CONSTRUCT { ?recommendable0 ?predicate0 ?similarity0 } WHERE {
?recommendable0 ?predicate0 ?object0.
owbes:Dies_Irae ?predicate0 ?object0.
?predicate0 owbes:hasSimilarityValue ?similarity0.
?recommendable0 rdf:type ?someType.
?someType rdfs:subClassOf owbes:Recommendable.
}
It works fine, I get in the results what I'm supposed to. However, I also get the same instance owbes:Dies_Irae. Is there a way to exclude it from the result?
Well, I'm sure there is. I tried to search, I found that there is a filter, I tried to use it, but no succeed. This is the filter that I apply FILTER (?recmmendable0 != owbes:Dies_Irae)
I also tried to check if both of them have the same rdf:about but it didn't work.
Here you go the result:
<http://www.welovethesemanticweb.com/recommendation-systems#Requiem:_Sequentia>
recommendation-systems:hasArtist
"0.4"^^xsd:double .
recommendation-systems:Le_nozze_di_Figaro
recommendation-systems:hasArtist
"0.4"^^xsd:double .
recommendation-systems:Dies_Irae
recommendation-systems:hasArtist
"0.4"^^xsd:double .
as you see, the last instance is the one that I'd like to exclude
FILTER (?recmmendable0 != owbes:Dies_Irae)
You didn't spell recommendable0 correctly in your filter. Since the variable isn't used anywhere else, it never has a value, so the filter doesn't have anything to compare.