nquads.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from __future__ import annotations
  2. import warnings
  3. from typing import IO, Any, Optional
  4. from rdflib.graph import DATASET_DEFAULT_GRAPH_ID, ConjunctiveGraph, Graph
  5. from rdflib.plugins.serializers.nt import _quoteLiteral
  6. from rdflib.serializer import Serializer
  7. from rdflib.term import Literal
  8. __all__ = ["NQuadsSerializer"]
  9. class NQuadsSerializer(Serializer):
  10. """NQuads RDF graph serializer."""
  11. def __init__(self, store: Graph):
  12. if not store.context_aware:
  13. raise Exception(
  14. "NQuads serialization only makes " "sense for context-aware stores!"
  15. )
  16. super(NQuadsSerializer, self).__init__(store)
  17. self.store: ConjunctiveGraph
  18. def serialize(
  19. self,
  20. stream: IO[bytes],
  21. base: Optional[str] = None,
  22. encoding: Optional[str] = None,
  23. **kwargs: Any,
  24. ) -> None:
  25. if base is not None:
  26. warnings.warn("NQuadsSerializer does not support base.")
  27. if encoding is not None and encoding.lower() != self.encoding.lower():
  28. warnings.warn(
  29. "NQuadsSerializer does not use custom encoding. "
  30. f"Given encoding was: {encoding}"
  31. )
  32. encoding = self.encoding
  33. for context in self.store.contexts():
  34. for triple in context:
  35. stream.write(
  36. _nq_row(triple, context.identifier).encode(encoding, "replace")
  37. )
  38. stream.write("\n".encode("latin-1"))
  39. def _nq_row(triple, context):
  40. graph_name = context.n3() if context and context != DATASET_DEFAULT_GRAPH_ID else ""
  41. if isinstance(triple[2], Literal):
  42. return "%s %s %s %s .\n" % (
  43. triple[0].n3(),
  44. triple[1].n3(),
  45. _quoteLiteral(triple[2]),
  46. graph_name,
  47. )
  48. else:
  49. return "%s %s %s %s .\n" % (
  50. triple[0].n3(),
  51. triple[1].n3(),
  52. triple[2].n3(),
  53. graph_name,
  54. )