-
Notifications
You must be signed in to change notification settings - Fork 555
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* fix explicit dataset: FROM and FROM NAMED clause When using a FROM or FROM NAMED clause: redefine entirely the query's RDF dataset. Include only the graphs in FROM clause in the query's default graph Include only the graphs in the FROM NAMED clause in the query's named graphs Try to load external graphs only if they don't already exist in the given ConjunctiveGraph * Formatting with back and flake8 for commit d6858e0 Using rdflib rules * Fix import order on test_dataset_exclusive * Use Dataset instead of ConjunctiveGraph in test_dataset_exclusive and test_dataset_inclusive Since ConjunctiveGraph has been deprecated. Also define if dataset is inclusive or exclusive at Dataset init instead of using global param SPARQL_DEFAULT_GRAPH_UNION * Fix graph name def in test_dataset_inclusive and test_dataset_exclusive * Only get_context on default and named graphs once and use Dataset instead of ConjunctiveGraph * Update rdflib/plugins/sparql/sparql.py Co-authored-by: Ashley Sommer <[email protected]> --------- Co-authored-by: Nicholas Car <[email protected]> Co-authored-by: Ashley Sommer <[email protected]>
- Loading branch information
1 parent
d7b2d25
commit 5876266
Showing
4 changed files
with
264 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
from rdflib.graph import Dataset, Graph | ||
from rdflib.term import URIRef | ||
|
||
dataset = Dataset(default_union=False) | ||
# Adding into default graph | ||
dataset.add((URIRef("urn:s0"), URIRef("urn:p0"), URIRef("urn:o0"))) | ||
# Adding into named graphs | ||
dataset.add( | ||
( | ||
URIRef("urn:s1"), | ||
URIRef("urn:p1"), | ||
URIRef("urn:o1"), | ||
Graph(identifier=URIRef("urn:g1")), | ||
) | ||
) | ||
|
||
dataset.add( | ||
( | ||
URIRef("urn:s2"), | ||
URIRef("urn:p2"), | ||
URIRef("urn:o2"), | ||
Graph(identifier=URIRef("urn:g2")), | ||
) | ||
) | ||
|
||
dataset.add( | ||
( | ||
URIRef("urn:s3"), | ||
URIRef("urn:p3"), | ||
URIRef("urn:o3"), | ||
Graph(identifier=URIRef("urn:g3")), | ||
) | ||
) | ||
|
||
|
||
# Test implicit exlusive dataset | ||
def test_exclusive(): | ||
results = list(dataset.query("SELECT ?s ?p ?o WHERE {?s ?p ?o}")) | ||
assert results == [(URIRef("urn:s0"), URIRef("urn:p0"), URIRef("urn:o0"))] | ||
|
||
|
||
# Test explicit default graph with exclusive dataset | ||
def test_from(): | ||
query = """ | ||
SELECT ?s ?p ?o | ||
FROM <urn:g1> | ||
WHERE {?s ?p ?o} | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [(URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1"))] | ||
|
||
|
||
# Test explicit named graphs with exclusive dataset | ||
def test_from_named(): | ||
query = """ | ||
SELECT | ||
?g ?s ?p ?o | ||
FROM NAMED <urn:g1> | ||
WHERE { | ||
graph ?g {?s ?p ?o} | ||
} | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(URIRef("urn:g1"), URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")) | ||
] | ||
|
||
|
||
# Test that we can use from and from named in the same query | ||
def test_from_and_from_named(): | ||
query = """ | ||
SELECT ?g ?s ?p ?o | ||
FROM <urn:g1> | ||
FROM NAMED <urn:g2> | ||
WHERE { | ||
{?s ?p ?o} | ||
UNION {graph ?g {?s ?p ?o}} | ||
} ORDER BY ?s | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(None, URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")), | ||
(URIRef("urn:g2"), URIRef("urn:s2"), URIRef("urn:p2"), URIRef("urn:o2")), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,150 @@ | ||
from rdflib.graph import Dataset, Graph | ||
from rdflib.term import URIRef | ||
|
||
dataset = Dataset(default_union=True) | ||
# Adding into default graph | ||
dataset.add((URIRef("urn:s0"), URIRef("urn:p0"), URIRef("urn:o0"))) | ||
# Adding into named graphs | ||
dataset.add( | ||
( | ||
URIRef("urn:s1"), | ||
URIRef("urn:p1"), | ||
URIRef("urn:o1"), | ||
Graph(identifier=URIRef("urn:g1")), | ||
) | ||
) | ||
|
||
dataset.add( | ||
( | ||
URIRef("urn:s2"), | ||
URIRef("urn:p2"), | ||
URIRef("urn:o2"), | ||
Graph(identifier=URIRef("urn:g2")), | ||
) | ||
) | ||
|
||
dataset.add( | ||
( | ||
URIRef("urn:s3"), | ||
URIRef("urn:p3"), | ||
URIRef("urn:o3"), | ||
Graph(identifier=URIRef("urn:g3")), | ||
) | ||
) | ||
|
||
|
||
# Test implicit inclusive dataset | ||
# The query's default graph should contain a merge of all graphs: | ||
# The service's default graph + all the service's named graphs | ||
def test_inclusive(): | ||
query = """ | ||
SELECT ?s ?p ?o | ||
WHERE {?s ?p ?o} | ||
ORDER BY ?s | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(URIRef("urn:s0"), URIRef("urn:p0"), URIRef("urn:o0")), | ||
(URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")), | ||
(URIRef("urn:s2"), URIRef("urn:p2"), URIRef("urn:o2")), | ||
(URIRef("urn:s3"), URIRef("urn:p3"), URIRef("urn:o3")), | ||
] | ||
|
||
|
||
# Test explicit default graph with inclusive dataset | ||
def test_default_from_1(): | ||
query = """ | ||
SELECT ?s ?p ?o | ||
FROM <urn:g1> | ||
WHERE {?s ?p ?o} | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [(URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1"))] | ||
|
||
|
||
# test that we include more than one graph into the default graph | ||
def test_default_from_2(): | ||
query = """ | ||
SELECT ?s ?p ?o | ||
FROM <urn:g1> | ||
FROM <urn:g2> | ||
WHERE {?s ?p ?o} | ||
ORDER BY ?s | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")), | ||
(URIRef("urn:s2"), URIRef("urn:p2"), URIRef("urn:o2")), | ||
] | ||
|
||
|
||
# Since there is a FROM clause, we consider RDF dataset explicit | ||
# Thus if FROM NAMED is not defined, named graph is considered empty set | ||
def test_named_from(): | ||
query = """ | ||
SELECT ?s ?p ?o | ||
FROM <urn:g1> | ||
WHERE { | ||
graph ?g {?s ?p ?o} | ||
} ORDER BY ?s | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [], "no result expected" | ||
|
||
|
||
# Test explicit named graphs with inclusive dataset | ||
def test_named_from_named_1(): | ||
query = """ | ||
SELECT ?g ?s ?p ?o | ||
FROM NAMED <urn:g1> | ||
WHERE { | ||
graph ?g {?s ?p ?o} | ||
} | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(URIRef("urn:g1"), URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")) | ||
] | ||
|
||
|
||
# test that we include more than one graph into the named graphs | ||
def test_named_from_named_2(): | ||
query = """ | ||
SELECT ?g ?s ?p ?o | ||
FROM NAMED <urn:g1> | ||
FROM NAMED <urn:g2> | ||
WHERE { | ||
graph ?g {?s ?p ?o} | ||
} ORDER BY ?g | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(URIRef("urn:g1"), URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")), | ||
(URIRef("urn:g2"), URIRef("urn:s2"), URIRef("urn:p2"), URIRef("urn:o2")), | ||
] | ||
|
||
|
||
# Since there is a FROM NAMED clause, we consider RDF dataset explicit | ||
# Thus if FROM is not defined, default graph is considered empty | ||
def test_default_from_named(): | ||
results = list( | ||
dataset.query("SELECT ?g ?s ?p ?o FROM NAMED <urn:g1> WHERE {?s ?p ?o}") | ||
) | ||
assert results == [], "no result expected" | ||
|
||
|
||
def test_from_and_from_named(): | ||
query = """ | ||
SELECT ?g ?s ?p ?o | ||
FROM <urn:g1> | ||
FROM NAMED <urn:g2> | ||
WHERE { | ||
{?s ?p ?o} | ||
UNION {graph ?g {?s ?p ?o}} | ||
} ORDER BY ?s | ||
""" | ||
results = list(dataset.query(query)) | ||
assert results == [ | ||
(None, URIRef("urn:s1"), URIRef("urn:p1"), URIRef("urn:o1")), | ||
(URIRef("urn:g2"), URIRef("urn:s2"), URIRef("urn:p2"), URIRef("urn:o2")), | ||
] |