diff --git a/rdflib/plugins/serializers/nquads.py b/rdflib/plugins/serializers/nquads.py index b74b9cab5..d88454d1e 100644 --- a/rdflib/plugins/serializers/nquads.py +++ b/rdflib/plugins/serializers/nquads.py @@ -3,7 +3,7 @@ import warnings from typing import IO, Any, Optional -from rdflib.graph import ConjunctiveGraph, Graph +from rdflib.graph import DATASET_DEFAULT_GRAPH_ID, ConjunctiveGraph, Graph from rdflib.plugins.serializers.nt import _quoteLiteral from rdflib.serializer import Serializer from rdflib.term import Literal @@ -45,17 +45,18 @@ def serialize( def _nq_row(triple, context): + graph_name = context.n3() if context and context != DATASET_DEFAULT_GRAPH_ID else "" if isinstance(triple[2], Literal): return "%s %s %s %s .\n" % ( triple[0].n3(), triple[1].n3(), _quoteLiteral(triple[2]), - context.n3(), + graph_name, ) else: return "%s %s %s %s .\n" % ( triple[0].n3(), triple[1].n3(), triple[2].n3(), - context.n3(), + graph_name, ) diff --git a/test/test_serializers/test_nquads_default_graph.py b/test/test_serializers/test_nquads_default_graph.py new file mode 100644 index 000000000..c1699d235 --- /dev/null +++ b/test/test_serializers/test_nquads_default_graph.py @@ -0,0 +1,39 @@ +from rdflib import Dataset +from rdflib.compare import isomorphic + + +def test_nquads_default_graph(): + data = """ + @prefix rdf: . + @prefix rdfs: . + @prefix xsd: . + + { + "2012-04-09"^^xsd:date . + } + + { + a ; + "http://manu.sporny.org/about#manu" ; + "Gregg Kellogg" . + + a ; + "http://greggkellogg.net/foaf#me" ; + "Manu Sporny" . + } + """ + + ds = Dataset() + ds.parse(data=data, format="trig") + output = ds.serialize(format="nquads") + + # The internal RDFLib default graph identifier should not appear in the output. + assert "" not in output + + # Ensure dataset round-trip still works. + ds2 = Dataset() + ds2.parse(data=output, format="nquads") + for graph in ds.graphs(): + assert isomorphic(graph, ds2.graph(graph.identifier)), print( + f"{graph.identifier} not isomorphic" + )