From 5e86f661eeaabcd382919ad351298be53c829117 Mon Sep 17 00:00:00 2001 From: Edmond Chuc Date: Mon, 20 Oct 2025 12:57:22 +1000 Subject: [PATCH] feat: add Dataset __iadd__ support fixes: https://github.com/RDFLib/rdflib/issues/3031 --- rdflib/graph.py | 6 ++ test/test_dataset/test_dataset_add.py | 88 ++++++++++++++++++++++++++- test/test_sparql/test_initbindings.py | 5 +- 3 files changed, 96 insertions(+), 3 deletions(-) diff --git a/rdflib/graph.py b/rdflib/graph.py index 5d739a9574..32b879bda2 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 a3197ae2e2..3a56998ac3 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 55f5853a3c..58aa8d6177 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(