Getting Wrong Result in Sparql - sparql

I am try to Implement a Sparql Query which will give some result.I am trying to Implement Like this:
My Data points are below from where I getting the data:
Subject:
<http://rhizomik.net/semanticxbrl/0001397832_agph-20110930/Context_9ME_30-Sep-2011/ConvertibleNotesPayableTextBlock/>
Predicate:
<http:// www.w3.org/1999/02/22-rdf-syntax-ns#type>
Object:
<http://www.atlanticgreenpower.com/20110930#ConvertibleNotesPayableTextBlock>
My Query is
PREFIX ab: <http:// www.atlanticgreenpower.com/20110930#>
SELECT ?node ?val_type ?value
WHERE {
?node ab:val_type ?val_type .
?node ab:value ?value .
}
I want to get the result of all subject predicate and object.I am new to sparql.please help me out

In SPARQL everything with a ? in front of it is a variable. If you want everything from the subject, predicate and object you can do it like this:
SELECT ?s ?p ?o WHERE { ?s ?p ?o }
But then you list everything. When you want to only list the values of your given subject you will have to do it like this:
SELECT * WHERE { <http://rhizomik.net/semanticxbrl/0001397832_agph-20110930/Context_9ME_30-Sep-2011/ConvertibleNotesPayableTextBlock/> ?p ?o }
And your query could easily be formatted to something like this:
PREFIX ab: <http:// www.atlanticgreenpower.com/20110930#>
SELECT ?s ?valType ?value WHERE {
?s ab:val_type ?valType ;
ab:value ?value .
}
Where ; marks when you want to include something else in your query with your given subject, but . marks the end of your query. If you want more information about how SPARQL works or how you can query check out the Euclid project with webinar recording: Querying linked data, 2013-03-04 or just test it yourself on a SPARQL endpoint like from FactForge.
To reflect my comment below:
SELECT * WHERE { ?s ?p <http://www.atlanticgreenpower.com/20110930#ConvertibleNotesPayableTextBlock> }
will select everything with the given object.

Try this:
SELECT * WHERE
{
?s ?p <http://www.atlanticgreenpower.com/20110930#ConvertibleNotesPayableTextBlock>
}

Related

SPARQL returning empty result when passing MIN(?date1) from subquery into outer query, with BIND((YEAR(?minDate) - YEAR(?date2)) AS ?diffDate)

<This question is now resolved, see comment by Valerio Cocchi>
I am trying to pass a variable from a subquery, that takes the minimum date of a set of dates ?date1 belonging to ?p and passes this to the outer query, which then takes another date ?date2 belonging to ?p (there can be at most 1 ?date2 for every ?p) and subtracts ?minDate from ?date2 to get an integer value for the number of years between. I am getting a blank value for this, i.e. ?diffDate returns no value.
I am using Fuseki version 4.3.2. Here is an example of the query:
SELECT ?p ?minDate ?date2 ?diffDate
{
?p a abc:P;
abc:hasAnotherDate ?date2.
BIND((YEAR(?minDate) - YEAR(?date2)) AS ?diffDate)
{
SELECT ?p (MIN(?date1) as ?minDate)
WHERE
{
?p a abc:P;
abc:hasDate ?date1.
} group by ?p
}
}
and an example of the kind of result I am getting:
|-?p----|-----------------?minDate-------------|-----------------?date2------------- |?diffDate|
|<123>|20012-11-22T00:00:00"^^xsd:dateTime|2008-08-18T00:00:00"^^xsd:dateTime| |
I would expect that ?diffDate would give me an integer value. Am I missing something fundamental about how subqueries work in SPARQL?
It seems you have encountered quite an obscure part of the SPARQL spec, namely how BIND works.
Normally SPARQL is evaluated without regard for the position of atoms, i.e.
SELECT *
WHERE {
?a :p1 ?b .
?b :p2 ?c .}
is the same query as:
SELECT *
WHERE {
?b :p2 ?c .
?a :p1 ?b .}
However, BIND is position dependent, so e.g.:
SELECT *
WHERE {
?a :p1 ?b .
BIND(:john AS ?a)}
is not a valid query, whereas:
SELECT *
WHERE {
BIND(:john AS ?a)
?a :p1 ?b .
}
is entirely valid. The same applies to variables used inside of the BIND, which must be declared before the BIND appears.
See here for more.
To go back to your problem, your BIND is using the ?minDate variable before it has been bound, which is why it fails to produce a value for ?diffDate.
This query should do the trick:
SELECT ?p ?minDate ?date2 ?diffDate
{
?p a abc:P;
abc:hasAnotherDate ?date2.
{
SELECT ?p (MIN(?date1) as ?minDate)
WHERE
{
?p a abc:P;
abc:hasDate ?date1.
} group by ?p
}
BIND((YEAR(?minDate) - YEAR(?date2)) AS ?diffDate) #Put the BIND after all the variables it uses are bound.
}
Alternatively, you could evaluate the difference in the SELECT, like so:
SELECT ?p ?minDate ?date2 (YEAR(?minDate) - YEAR(?date2) AS ?diffDate)
{
?p a abc:P;
abc:hasAnotherDate ?date2.
{
SELECT ?p (MIN(?date1) as ?minDate)
WHERE
{
?p a abc:P;
abc:hasDate ?date1.
} group by ?p
}
}

Is there a good example of how to use SPARQL to replace a substring with another substring across a collection of triples?

I want to edit a set of URIs replacing a substring "iso-693" with "iso-639" using a SPARQL query. I am using REPLACE but it doesn't seem to do anything.
I have a large SKOS taxonomy with URIs that have an incorrect string. They should have this string: "iso-639" but I made a mistake when creating it and put "iso-693". I'd like to correct it. I used the SPARQL query shown below, which when run returns a message "update successful", but none of the triples data actually changes. Where am I going wrong?
INSERT
{
?s ?p ?o2
}
WHERE
{
?s ?p ?o .
FILTER (regex(str(?s), "iso-693") || regex(str(?o), "iso-693"))
BIND(REPLACE(?o, "iso-693", "iso-639", "i") AS ?o2) .
}
I expected all of the occurrences of the substring to change to the desired value, but nothing seems to change at all despite the success message.
You are missing the bit that removes the old value (INSERT just adds a new triples). To replace a triple, you should DELETE the old triple at the same time as you are INSERTing the new one, like this:
DELETE
{
?s ?p ?o
}
INSERT
{
?s ?p ?o2
}
WHERE
{
?s ?p ?o .
FILTER (regex(str(?s), "iso-693") || regex(str(?o), "iso-693"))
BIND(REPLACE(?o, "iso-693", "iso-639", "i") AS ?o2) .
}
If you are targeting URIs then you need to construct new IRIs with the required substitution and use these in the INSERT part of the update along with the original values fro ?s and ?o for DELETE part. The REPLACE will produce Literals which is not correct fro subjects.
Suggest using something along following lines:
DELETE {
?s ?p ?o
}
INSERT {
?newS ?p ?newO
} WHERE {
?s ?p ?o .
bind("iso-693" as ?match) .
bind("iso-639" as ?replacement) .
bind (regex(str(?s), ?match) as ?subjMatch) .
bind (regex(str(?o), ?match) as ?objMatch) .
filter (?subjMatch || ?objMatch)
bind (if(?subjMatch, IRI(replace(str(?s), ?match, ?replacement)), ?s) as ?newS)
bind (if(?objMatch, IRI(replace(str(?o), ?match, ?replacement)), ?o) as ?newO)
}

Sparql CONSTRUCT with DISTINCT

PREFIX content: <http://example.com/content#>
construct { ?s content:field ?o}
WHERE { ?s content:field ?o }
90% of all the ?o I get here are the same URI <http://example.com/name>.
I'm trying to find a way to filter out all quads that have the same value for ?o, so in the end I get a list of quads which are unique by its ?o
I tried DISTINCT ?o CONSTRUCT{...} but from what I saw you cant use DISTINCT on a CONSTRUCT.
How would you filter the returned list of quads
I'm trying to find a way to filter out all quads that have the same
value for ?o, so in the end I get a list of quads which are unique by
its ?o
if it does not matter which exact value is bound to ?s, then a sub-select with a group by ?o is the way to go. Use (SAMPLE(?s) as ?subj) e.g. something like:
`
PREFIX content: <http://example.com/content#>
construct { ?s content:field ?o}
WHERE {
{ select ?o (SAMPLE(?subj) as ?s)
{ ?subj content:field ?o }
group by ?o
}
}
`

Number of triples of specific group instances?

I have found another problem in SPARQLing dbpedia. I am trying to get number of triples for specific group of class instances.
Number of triples of class Politician:
SELECT * WHERE {?s ?p ?o FILTER (?s = dbo:Politician OR ?o = dbo:Politician)}
But what about summary number of all triples for a specific group of politicians? For example number of triples of german politician. How is possible to get?
Thank you for your help!
revised answer
This will get the count of entities who are described as being Politicians from Germany —
SELECT COUNT(*)
{ ?s a dbo:Politician .
?s dbo:nationality dbr:Germany .
}
— and this will get the count of all records where those entities who are described as being Politicians from Germany appear as Subject —
SELECT COUNT(*)
{ ?s a dbo:Politician .
?s dbo:nationality dbr:Germany .
?s ?p ?o .
}
It is possible that you're looking for a bit more info, to include all records where the entities who are described as being Politicians from Germany appears as either Subject or Object (not just as Subject) —
SELECT COUNT(*)
{ { ?s a dbo:Politician .
?s dbo:nationality dbr:Germany .
?s ?p ?o .
}
UNION
{ ?o a dbo:Politician .
?o dbo:nationality dbr:Germany .
?s ?p ?o .
}
}
original answer
I think you are currently aiming for this, which counts all triples with dbo:Politician as either Subject or Object (which is currently 41105, without timeout), but note that this query doesn't count "entities which are politicians" which is (I think) what you're really after!
SELECT ( COUNT ( * ) AS ?NumberOfTriples )
WHERE
{ { dbo:Politician ?p ?o }
UNION
{ ?s ?p dbo:Politician }
}
If you want to count the number of "entities which are politicians" (i.e., rdf:type dbo:Politician) (currently 41078), you need a different query, like this --
SELECT ( COUNT ( DISTINCT ?s ) AS ?NumberOfPoliticians )
WHERE
{ ?s rdf:type dbo:Politician }
This should be clarified by a look at the { dbo:Politician ?p ?o } triples --
SELECT *
WHERE
{ dbo:Politician ?p ?o }

Is it possible to Filter Graphs in a way that they at most contain requested Data?

Let me start with an example query to explain my problem:
SELECT ?g ?s ?p ?o WHERE
{
{GRAPH ?g
{ ?s ?p ?o.
OPTIONAL{ ?s
ab:temperature ?temperature.}
FILTER (?temperature = 20)
FILTER NOT EXISTS {?s ab:person ?person}
}
}
}
This query gives me all graphs (in this case representing context data) that have a temperature of 20 but don't have a person associated. My problem is I want to query the graphs for certain optional properties but they shouldn't have any other properties. At the time of the query I only know the OPTIONAL part but I don't know which additional property might be there. Is there an easy way to do this with SPARQL or is that something that would be easier to check after I received the graph and converted it to an object which I can handle with my programm?
If i understand your question correctly, you are searching for graphs that only have that subjects with some properties but not others. In that case i'd run something like this:
SELECT ?g ?s ?p ?o WHERE {
GRAPH ?g {
?s ?p ?o.
FILTER NOT EXISTS {
?s ?bad [] .
FILTER (?bad NOT IN ( ab:temperature, ... ) )
}
}
}