Thanks, that works! Still have to learn the order of execution with
these queries...
Br,
Mikael
On 30.5.2016 20:49, Andy Seaborne wrote:
Mikael,
So is the question why GRAPH ?g {} gets all the graphs but
GRAPH ?g { OPTIONAL { ?g .... } } doesn't?
GRAPH ?g { PATTERN } is defined as:
eval(D(G), Graph(var,PATTERN)) =
Let R be the empty multiset
foreach IRI i in D
R := Union(R, Join( eval(D(D[i]), PATTERN) , Ω(?var->i) )
the result is R
That is, loop on each named graph, execute the inner part, then join
on the GRAPH variable.
The important point here is that OPTIONAL { ?g .... } is executed,
then the GRAPH ?g is joined in, not the other way round.
Try this:
SELECT * {
GRAPH ?g {}
OPTIONAL { GRAPH ?g { ?g dc:title ?title } } .
}
}
which is loosely - get all the graph names and if they have a
dc:title, include that. OPTIONAL only ever adds - but at the point it
is executed, not through the query.
Data (Trig):
--------------------------------
PREFIX : <http://example/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
<http://www.lingsoft.fi/tmp1>
{
<http://www.lingsoft.fi/tmp1> dc:title "title1"
}
<http://www.lingsoft.fi/tmp2>
{
<urn:different> dc:title "title1"
}
<http://www.lingsoft.fi/tmp3>
{
<http://www.lingsoft.fi/tmp3> :no_title 123 .
}
--------------------------------
--------------------------------------------
| g | title |
============================================
| <http://www.lingsoft.fi/tmp2> | |
| <http://www.lingsoft.fi/tmp3> | |
| <http://www.lingsoft.fi/tmp1> | "title1" |
--------------------------------------------
Andy
On 30/05/16 13:55, Mikael Pesonen wrote:
Hi,
tested this some more. This
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1 ?graphTitle2
WHERE {
GRAPH ?graph
{
OPTIONAL { ?graph dcterms:title ?graphTitle1}
OPTIONAL { ?graph dc:title ?graphTitle2}
}}
returns same set as this
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1
WHERE {
GRAPH ?graph
{
OPTIONAL { ?graph dcterms:title ?graphTitle1}
}}
and same set as this
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1
WHERE {
GRAPH ?graph
{
?graph dcterms:title ?graphTitle1
}}
This returns dc:title
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1
WHERE {
GRAPH ?graph
{
OPTIONAL { ?graph dc:title ?graphTitle1 }
}}
and this returns the same
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1
WHERE {
GRAPH ?graph
{
?graph dc:title ?graphTitle1
}}
To get all graphs, only this works:
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT DISTINCT ?graph ?graphTitle1
WHERE {
GRAPH ?graph
{
}}
For testing I added a minimum graph
PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA
{
GRAPH <http://www.lingsoft.fi/tmp>
{
<http://www.lingsoft.fi/tmp> dc:title "tmp title"
}
}
and this behaves like the rest of graphs.
I'm using this db: apache-jena-fuseki-2.3.1
Br,
Mikael
On 29.5.2016 12:36, Andy Seaborne wrote:
On 27/05/16 14:23, Mikael Pesonen wrote:
Hi,
This query does what i want, that is, lists all graphs having the term
"digitalisaatio"@fi:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?s ?graphTitle1 ?graphTitle2
WHERE {
GRAPH ?graph
{
?s skos:prefLabel "digitalisaatio"@fi
OPTIONAL { ?graph dcterms:title ?graphTitle1 }
}}
But when I add new param
OPTIONAL { ?graph dc:title ?graphTitle2}
so that new query is this:
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?s ?graphTitle1 ?graphTitle2
WHERE {
GRAPH ?graph
{
?s skos:prefLabel "digitalisaatio"@fi
OPTIONAL { ?graph dcterms:title ?graphTitle1 }
OPTIONAL { ?graph dc:title ?graphTitle2}
}}
This will depend on your data model.
Do you have a complete, minimal example? (some small amount of data
and a query that you expect to work).
I dont get all the graphs anymore. OPTIONAL should never filter out
data, just add? There must be a logical explanation, but I'm not
getting
it. Im using Fuseki.
Which version?
Andy
By the way:
OPTIONAL { ?graph (dcterms:title|dc:title) ?graphTitle1 }
asks for either dcterms:title or dc:title or both.
Br,
Mikael
--
www.lingsoft.fi
Speech Applications - Language Management - Translation - Reader's and Writer's
Tools - Text Tools - E-books and M-books
Mikael Pesonen
System Engineer
e-mail: mikael.peso...@lingsoft.fi
Tel. +358 2 279 3300
Time zone: GMT+2
Helsinki Office
Eteläranta 10
FI-00130 Helsinki
FINLAND
Turku Office
Linnankatu 10 A
FI-20100 Turku
FINLAND