Devs,
I've taken a first pass at implementing a simple TriX serializer. I
should have attached the new file (which goes in
`.../rdflib/syntax/serializers/TriXSerializer.py`) to this email,
along with a crazy little test script. The test script exercises
round tripping, but it turned out parsing was broken, so I fixed it;
the patch for that (and adding the new serializer to the plugin list)
should be attached as well. Finally, does anyone mind if I clean up
the TriX parser a bit?
Take care,
John L. Clark
--
PLEASE NOTE that this message is not digitally signed. As a result,
you have no strong evidence that this message was actually sent by me.
Upon request I can provide a digitally signed receipt for this
message or other evidence validating its contents if you need such
evidence.
Index: rdflib/plugin.py
===================================================================
--- rdflib/plugin.py (revision 1239)
+++ rdflib/plugin.py (working copy)
@@ -49,6 +49,9 @@
register('pretty-xml', serializers.Serializer,
'rdflib.syntax.serializers.PrettyXMLSerializer', 'PrettyXMLSerializer')
+register('TriX', serializers.Serializer,
+ 'rdflib.syntax.serializers.TriXSerializer', 'TriXSerializer')
+
register('nt', serializers.Serializer,
'rdflib.syntax.serializers.NTSerializer', 'NTSerializer')
Index: rdflib/syntax/parsers/TriXHandler.py
===================================================================
--- rdflib/syntax/parsers/TriXHandler.py (revision 1239)
+++ rdflib/syntax/parsers/TriXHandler.py (working copy)
@@ -33,6 +33,7 @@
"""
from rdflib import RDF, RDFS, Namespace
from rdflib import URIRef, BNode, Literal
+from rdflib.Namespace import Namespace
from rdflib.Graph import Graph
from rdflib.exceptions import ParserError, Error
from rdflib.syntax.xml_names import is_ncname
@@ -42,7 +43,7 @@
RDFNS = RDF.RDFNS
-TRIXNS=Namespace.Namespace("http://www.w3.org/2004/03/trix/trix-1/")
+TRIXNS=u"http://www.w3.org/2004/03/trix/trix-1/"
class TriXHandler(handler.ContentHandler):
@@ -200,6 +201,7 @@
self.error("This should never happen if the SAX parser ensures XML syntax correctness")
if name[1]=="graph":
+ self.graph = Graph(store = self.store.store)
self.state=1
if name[1]=="TriX":
from rdflib.syntax.serializers import Serializer
from rdflib.URIRef import URIRef
from rdflib.Literal import Literal
from rdflib.BNode import BNode
from rdflib.Graph import Graph, ConjunctiveGraph
from Ft.Xml import MarkupWriter, XML_NAMESPACE
TRIX_NS = u"http://www.w3.org/2004/03/trix/trix-1/"
class TriXSerializer(Serializer):
def __init__(self, store):
super(TriXSerializer, self).__init__(store)
def serialize(self, stream, base=None, encoding=None, **args):
self.writer = MarkupWriter(stream=stream, encoding=encoding,
indent="yes")
self.writer.startDocument()
self.writer.startElement(u"TriX", TRIX_NS)
if isinstance(self.store, ConjunctiveGraph):
for subgraph in self.store.contexts():
self._writeGraph(subgraph)
elif isinstance(self.store, Graph):
self._writeGraph(self.store)
else:
pass
self.writer.endElement(u"TriX", TRIX_NS)
self.writer.endDocument()
def _writeGraph(self, graph):
self.writer.startElement(u"graph", TRIX_NS)
if isinstance(graph.identifier, URIRef):
self.writer.simpleElement(u"uri", TRIX_NS,
content=unicode(graph.identifier))
for triple in graph.triples((None,None,None)):
self._writeTriple(triple)
self.writer.endElement(u"graph", TRIX_NS)
def _writeTriple(self, triple):
self.writer.startElement(u"triple", TRIX_NS)
for component in triple:
if isinstance(component, URIRef):
self.writer.simpleElement(u"uri", TRIX_NS,
content=unicode(component))
elif isinstance(component, BNode):
self.writer.simpleElement(u"id", TRIX_NS,
content=unicode(component))
elif isinstance(component, Literal):
if component.datatype:
self.writer.simpleElement(u"typedLiteral", TRIX_NS,
content=unicode(component),
attributes={u"datatype": unicode(component.datatype)})
elif component.language:
self.writer.simpleElement(u"plainLiteral", TRIX_NS,
content=unicode(component),
attributes={
(u"xml:lang", XML_NAMESPACE): unicode(component.language)})
else:
self.writer.simpleElement(u"plainLiteral", TRIX_NS,
content=unicode(component))
self.writer.endElement(u"triple", TRIX_NS)
from rdflib.Graph import ConjunctiveGraph
from rdflib import URIRef, Literal
from rdflib.Graph import Graph
s1 = URIRef('store:1')
r1 = URIRef('resource:1')
r2 = URIRef('resource:2')
label = URIRef('predicate:label')
g1 = Graph(identifier = s1)
g1.add((r1, label, Literal("label 1", lang="en")))
g1.add((r1, label, Literal("label 2")))
s2 = URIRef('store:2')
g2 = Graph(identifier = s2)
g2.add((r2, label, Literal("label 3")))
g = ConjunctiveGraph()
for s,p,o in g1.triples((None, None, None)):
g.addN([(s,p,o,g1)])
for s,p,o in g2.triples((None, None, None)):
g.addN([(s,p,o,g2)])
r3 = URIRef('resource:3')
g.add((r3, label, Literal(4)))
#g.addN([(r1, label, Literal("label 1"), s1),
# (r1, label, Literal("label 2"), s1),
# (r2, label, Literal("label 3"), s2)])
for c in g.contexts():
pass
#s = Graph(g.store, identifier=c)
#print c, c.identifier.__class__, c.identifier, len(c)
r = g.serialize(format='TriX')
print r
g3 = ConjunctiveGraph()
from rdflib.StringInputSource import StringInputSource
g3.parse(StringInputSource(r, None), format='trix')
for c in g3.contexts():
print c, c.identifier.__class__, c.identifier, len(c)
_______________________________________________
Dev mailing list
[email protected]
http://rdflib.net/mailman/listinfo/dev