Source code for rdflib.plugins.serializers.trig
"""
Trig RDF graph serializer for RDFLib.
See <http://www.w3.org/2010/01/Trig/Trig> for syntax specification.
"""
from rdflib.plugins.serializers.turtle import TurtleSerializer
from rdflib.plugins.serializers.turtle import _GEN_QNAME_FOR_DT
from rdflib.plugins.serializers.turtle import VERB
from rdflib.term import BNode, Literal
from collections import defaultdict
__all__ = ['TrigSerializer']
[docs]class TrigSerializer(TurtleSerializer):
short_name = "trig"
indentString = 4 * u' '
[docs] def __init__(self, store):
if store.context_aware:
self.contexts = store.contexts()
else:
self.contexts = [store]
super(TrigSerializer, self).__init__(store)
def _get_graph(self, id):
if self.store.context_aware:
return self.store.get_context(id)
else:
# non-context aware graphs only contain one graph
return self.store
[docs] def preprocess(self):
for context in self.contexts:
for triple in context:
self.preprocessTriple(triple, context)
[docs] def preprocessTriple(self, triple, store):
s, p, o = triple
references = self.refCount(o) + 1
self._references[o] = references
self._subjects[s] = True
self._contexts[store].add(s)
for i, node in enumerate(triple):
if node in self.keywords:
continue
# Don't use generated prefixes for subjects and objects
self.getQName(node, gen_prefix=(i == VERB))
if isinstance(node, Literal) and node.datatype:
self.getQName(node.datatype, gen_prefix=_GEN_QNAME_FOR_DT)
p = triple[1]
if isinstance(p, BNode):
self._references[p] = self.refCount(p) + 1
[docs] def buildPredicateHash(self, subject):
"""
Build a hash key by predicate to a list of objects for the given
subject
"""
properties = {}
for s, p, o in self._current_graph.triples((subject, None, None)):
oList = properties.get(p, [])
oList.append(o)
properties[p] = oList
return properties
[docs] def reset(self):
super(TrigSerializer, self).reset()
self._contexts = defaultdict(set)
[docs] def serialize(self, stream, base=None, encoding=None,
spacious=None, **args):
self.reset()
self.stream = stream
self.base = base
if spacious is not None:
self._spacious = spacious
self.preprocess()
# @@FIXME: Unused code ...
# subjects_list = self.orderSubjects()
self.startDocument()
firstTime = True
for store, subjects in self._contexts.items():
self._serialized = {}
self._current_graph = store
self.write(self.indent() + '\n<%s> = {' % store.identifier)
self.depth += 1
for subject in subjects:
if self.isDone(subject):
continue
if firstTime:
firstTime = False
if self.statement(subject) and not firstTime:
self.write('\n')
self.depth -= 1
self.write('}\n')
self.endDocument()
stream.write(u"\n".encode('ascii'))