diff --git a/rdflib/graph.py b/rdflib/graph.py index 7b7256d04..bef31e2b6 100644 --- a/rdflib/graph.py +++ b/rdflib/graph.py @@ -2591,6 +2591,12 @@ def __setstate__( # type error: Property "identifier" defined in "Graph" is read-only self.store, self.identifier, self.default_graph, self.default_union = state # type: ignore[misc] + def __iadd__(self: _DatasetT, other: Iterable[_QuadType]) -> _DatasetT: # type: ignore[override, misc] + """Add all quads in Dataset other to Dataset. + BNode IDs are not changed.""" + self.addN((s, p, o, g) for s, p, o, g in other) + return self + def graph( self, identifier: Optional[Union[_ContextIdentifierType, _ContextType, str]] = None, diff --git a/test/test_dataset/test_dataset_add.py b/test/test_dataset/test_dataset_add.py index a3197ae2e..3a56998ac 100644 --- a/test/test_dataset/test_dataset_add.py +++ b/test/test_dataset/test_dataset_add.py @@ -1,4 +1,8 @@ -from rdflib import RDF, RDFS, Dataset, Graph, URIRef +from textwrap import dedent + +from rdflib import RDF, RDFS, Dataset, Graph, Literal, URIRef +from rdflib.compare import isomorphic +from rdflib.graph import DATASET_DEFAULT_GRAPH_ID from test.data import TEST_DATA_DIR @@ -99,3 +103,85 @@ def test_dataset_parse_return_value(): ) assert len(ds) assert return_value is ds + + +def test_dataset_iadd(): + ds = Dataset() + ds.add( + ( + URIRef("https://example.com/subject"), + URIRef("https://example.com/p/predicate"), + Literal("object"), + ) + ) + + ds2 = Dataset() + ds2.add( + ( + URIRef("https://example.com/subject"), + URIRef("https://example.com/p/predicate"), + Literal("object"), + URIRef("https://example.com/graph"), + ) + ) + + data = """ + { + "object2" . + } + + { + "Triple-Other" . + } + + { + "Triple Y" . + } + + """ + ds3 = Dataset().parse(data=data, format="trig") + + # Combine the datasets + ds += ds2 + ds3 + + expected_default_graph_data = dedent( + """ + @prefix ns2: . + @prefix ns3: . + ns2:subject2 ns3:predicate2 "object2" . + ns2:subject ns3:predicate "object" . + """ + ) + expected_default_graph = Graph(identifier=DATASET_DEFAULT_GRAPH_ID).parse( + data=expected_default_graph_data, format="turtle" + ) + + expected_graph1_data = dedent( + """ + @prefix ns2: . + @prefix ns3: . + ns2:subject ns3:predicate "object" . + ns2:subject-other ns3:predicate-other "Triple-Other" . + """ + ) + expected_graph1 = Graph(identifier=URIRef("https://example.com/graph")).parse( + data=expected_graph1_data, format="turtle" + ) + + expected_graph2 = dedent( + """ + @prefix ns2: . + ns2:subject-y ns2:predicate-y "Triple Y" . + """ + ) + expected_graph2 = Graph(identifier=URIRef("https://example.com/graph2")).parse( + data=expected_graph2, format="turtle" + ) + + assert isomorphic(expected_default_graph, ds.default_graph) + assert isomorphic( + expected_graph1, ds.get_graph(URIRef("https://example.com/graph")) + ) + assert isomorphic( + expected_graph2, ds.get_graph(URIRef("https://example.com/graph2")) + ) diff --git a/test/test_sparql/test_initbindings.py b/test/test_sparql/test_initbindings.py index 55f5853a3..58aa8d617 100644 --- a/test/test_sparql/test_initbindings.py +++ b/test/test_sparql/test_initbindings.py @@ -1,4 +1,5 @@ from rdflib import Dataset, Literal, URIRef, Variable +from rdflib.graph import DATASET_DEFAULT_GRAPH_ID from rdflib.plugins.sparql import prepareQuery from test.utils.namespace import EGDC @@ -274,8 +275,8 @@ def test_prepare(): def test_data(): data = Dataset() data += [ - (URIRef("urn:a"), URIRef("urn:p"), Literal("a")), - (URIRef("urn:b"), URIRef("urn:p"), Literal("b")), + (URIRef("urn:a"), URIRef("urn:p"), Literal("a"), DATASET_DEFAULT_GRAPH_ID), + (URIRef("urn:b"), URIRef("urn:p"), Literal("b"), DATASET_DEFAULT_GRAPH_ID), ] a = set(