Coverage for triplelite / _rdflib_bridge.py: 100%
39 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 16:42 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 16:42 +0000
1# SPDX-FileCopyrightText: 2026 Arcangelo Massari <arcangelo.massari@unibo.it>
2#
3# SPDX-License-Identifier: ISC
5from __future__ import annotations
7from typing import TYPE_CHECKING
9from rdflib import BNode, Dataset, Graph, Literal, Node, URIRef
11from triplelite._types import _XSD_STRING, RDFTerm
13if TYPE_CHECKING:
14 from triplelite._graph import TripleLite
17def _rdflib_to_rdfterm(node: URIRef | Literal | Node | RDFTerm) -> RDFTerm:
18 if isinstance(node, RDFTerm):
19 return node
20 if isinstance(node, Literal):
21 language = str(node.language) if node.language else ""
22 datatype = "" if language else (str(node.datatype) if node.datatype else _XSD_STRING)
23 return RDFTerm("literal", str(node), datatype, language)
24 return RDFTerm("uri", str(node))
27def _to_rdflib_triple(obj: RDFTerm) -> URIRef | Literal:
28 if obj.type == "literal":
29 if obj.lang:
30 return Literal(obj.value, lang=obj.lang)
31 return Literal(obj.value, datatype=URIRef(obj.datatype))
32 return URIRef(obj.value)
35def _from_rdflib_graph(graph: Graph) -> TripleLite:
36 from triplelite._graph import TripleLite
38 identifier = str(graph.identifier) if not isinstance(graph.identifier, BNode) else None
39 tl = TripleLite(identifier=identifier)
40 tl.add_many(
41 (str(subject), str(predicate), _rdflib_to_rdfterm(obj))
42 for subject, predicate, obj in graph
43 )
44 return tl
47def from_rdflib(source: Graph | Dataset) -> list[TripleLite]:
48 if isinstance(source, Dataset):
49 return [_from_rdflib_graph(graph) for graph in source.graphs()]
50 return [_from_rdflib_graph(source)]
53def to_rdflib(source: TripleLite) -> Graph | Dataset:
54 if source.identifier is not None:
55 dataset = Dataset()
56 named_graph = dataset.graph(URIRef(source.identifier))
57 for s, p, o in source:
58 named_graph.add((URIRef(s), URIRef(p), _to_rdflib_triple(o)))
59 return dataset
60 graph = Graph()
61 for s, p, o in source:
62 graph.add((URIRef(s), URIRef(p), _to_rdflib_triple(o)))
63 return graph