Utilizando o recurso de Quad onde cada tripla pode ser identificada como um grafo
Testes via AllegroGraph WebView na VM032
INSERT DATA {ns:c1 rdf:type ns:Country; ns:name 'Germany'; ns:language 'German'; ns:continent 'Europe'; ns:population 83000000 };
INSERT DATA {ns:c2 rdf:type ns:Country; ns:name 'France'; ns:language 'French'; ns:continent 'Europe'; ns:population 67000000 };
INSERT DATA {ns:c3 rdf:type ns:Country; ns:name 'United Kingdom'; ns:language 'English'; ns:continent 'Europe'; ns:population: 66000000 };
INSERT DATA {ns:p1 rdf:type ns:Person; ns:name 'John' };
INSERT DATA {ns:p2 rdf:type ns:Person; ns:name 'Harry'};
INSERT DATA {GRAPH ns:p1c1_1 {ns:p1 ns:LIVING_IN ns:c1}};
INSERT DATA {ns:p1c1_1 ns:date_of_start 2014};
INSERT DATA {GRAPH ns:p1c2_1 {ns:p1 ns:WORKING_IN ns:c2}};
INSERT DATA {ns:p1c2_1 ns:date_of_start 2014};
INSERT DATA {GRAPH ns:p1c3_1 { ns:p1 ns:LIVING_IN ns:c3}};
INSERT DATA {ns:p2c3_1 ns:date_of_start 2014};
INSERT DATA {GRAPH ns:p1c3_2 { ns:p1 ns:WORKING_IN ns:c3}};
INSERT DATA {ns:p2c3_1 ns:date_of_start 2014};
INSERT DATA {GRAPH ns:p3c1_1 { ns:p3 ns:LIVING_IN ns:c1}};
INSERT DATA {ns:p3c1_1 ns:date_of_start 2016};
INSERT DATA {GRAPH ns:p3c3_1 { ns:p3 ns:WORKING_IN ns:c3}};
INSERT DATA {ns:p3c3_1 ns:date_of_start 2014};
INSERT DATA {ns:p1p2_1 ns:date_of_start 2011};
INSERT DATA {GRAPH ns:p3p1_1 { ns:p3 ns:FRIENDS_WITH ns:p1}};
INSERT DATA {ns:p3p1_1 ns:date_of_start 2012} ;
INSERT DATA {GRAPH ns:p3p2_1 {ns:p3 ns:FRIENDS_WITH ns:p2}};
INSERT DATA {ns:p3p2_1 ns:date_of_start 2014};
--
# This PREFIX causes the default graph of the dataset to include
# only triples that are not in a named graph.
# Otherwise, the default graph will include every triple.
PREFIX franzOption_defaultDatasetBehavior: <franz:rdf>
# View quads
SELECT ?s ?p ?o ?g {
# default graph
{ ?s ?p ?o . }
UNION
# named graphs
{ GRAPH ?g { ?s ?p ?o . } }
}
--
SELECT ?s ?p ?o ?g { GRAPH ?g { ?s ?p ?o . } }
--
{ ?c rdf:type ns:Country; ns:name 'United Kingdom'.
GRAPH ?g { ?s ?p ?c . }
?g ns:date_of_start 2014}
--
WHERE {
GRAPH ?g { ?p ns:FRIENDS_WITH ?f. }.
?p rdf:type ns:Person; ns:name ?p_name.
?f ns:name ?f_name.
?g ns:date_of_start ?o.
FILTER (?o > 2010) .
}
--
SELECT ?p_name ?f_name ?o2 ?g2
WHERE {
GRAPH ?g1 { ?p ns:FRIENDS_WITH ?f1. }.
GRAPH ?g2 { ?p ns:FRIENDS_WITH ?f2. }.
?p rdf:type ns:Person; ns:name ?p_name.
?f2 ns:name ?f_name.
?g1 ns:date_of_start ?o1.
?g2 ns:date_of_start ?o2.
FILTER (?o2 > ?o1) .
}
--
SELECT ?p1_name ?p2_name ?p3_name ?p4_name ?o ?g2
WHERE {
GRAPH ?g1 { ?p1 ns:FRIENDS_WITH ?p3. }.
GRAPH ?g2 { ?p2 ns:FRIENDS_WITH ?p4. }.
?p1 rdf:type ns:Person; ns:name ?p1_name.
?p2 rdf:type ns:Person; ns:name ?p2_name.
?p3 rdf:type ns:Person; ns:name ?p3_name.
?p4 rdf:type ns:Person; ns:name ?p4_name.
?g1 ns:date_of_start ?o.
?g2 ns:date_of_start ?o.
FILTER (?p1 != ?p2) .
}
--
SELECT ?p1_name ?p2_name ?c1_name ?c2_name ?o ?g2
WHERE {
GRAPH ?g1 { ?p1 ns:LIVING_IN ?c1. }.
GRAPH ?g2 { ?p2 ns:LIVING_IN ?c2. }.
?p1 rdf:type ns:Person; ns:name ?p1_name.
?p2 rdf:type ns:Person; ns:name ?p2_name.
?c1 rdf:type ns:Country; ns:name ?c1_name.
?c2 rdf:type ns:Country; ns:name ?c2_name.
?g1 ns:date_of_start ?o.
?g2 ns:date_of_start ?o.
FILTER (?p1 != ?p2) .
}
--
PREFIX ns: <http://example.org/ns#>
SELECT ?p1_name ?p2_name ?o ?g
WHERE {
GRAPH ?g { ?p1 ns:FRIENDS_WITH+ ?p2. }.
?p1 rdf:type ns:Person; ns:name ?p1_name.
?p2 rdf:type ns:Person; ns:name ?p2_name.
OPTIONAL {?g ns:date_of_start ?o. FILTER (?o > 2010) .}
}
--
PREFIX ns: <http://example.org/ns#>
INSERT DATA {GRAPH ns:p1p2_2 { ns:p1 ns:FRIENDS_OF ns:p2}};
INSERT DATA {GRAPH ns:p3p1_2 { ns:p3 ns:FRIENDS_OF ns:p1}};
INSERT DATA {ns:p1p2_2 ns:date_of_start 2018};
INSERT DATA {ns:p3p1_2 ns:date_of_start 2019} ;
SELECT ?o ?g
WHERE {
GRAPH ?g { ns:p3 ns:FRIENDS_OF+ ns:p2. }.
?g ns:date_of_start ?o.
}
OBS.: Property path entre diferentes "grafos" não funciona pq existe um caminho p3p1_2 - p3p1_2 que não é recuperado com a query acima
Outras referências com SPARQL
Como recuperar os relacionamentos entre classes
select distinct ?class {?s1 a ?class}
Como recuperar os relacionamentos entre classes
select distinct ?class1 ?p ?class2 {?s1 a ?class1; ?p ?s2 . ?s2 a ?class2.} order by ?class1
Como recuperar os atributos das classes
SELECT ?s ?p ?o { ?s ?p ?o . (?s ?o) fti:match '<palavra chave>'.}
Comentários
Postar um comentário
Sinta-se a vontade para comentar. Críticas construtivas são sempre bem vindas.