/usr/lib/python2.7/dist-packages/swap/rdflib2rdf.py is in python-swap 1.2.1-7.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | """
This rdflib2rdf module provides code for glueing rdflib's rdf/xml
parser to cwm.
STATUS:
First pass, partially working, some questions.
QUESTIONS:
Does the context need to change per bag? I have assumed for the moment
not, as it breaks (or complicates) the interface between the parser
and the store.
Is there already or is there any interest in a ContextSink interface
to simplify the interface between the parser and the store? If
desired, I would be happy to help with any refactors that would be
needed. To better describe what I am thinking, I have implemented a
ContextSink enough to serve the purpose needed for this module.
Is urlparse.urljoin from the Python standard library buggy? RDFLib
uses urlparse.urljoin and I noticed that the differences between it
and uriparse.join are causing the test cases to fail (export
PYTHONPATH=..;python2.3 retest.py -n -f regression.n3). For example:
file:/devel/WWW/2000/10/swap/test/animal.rdf#
vs.
file:///devel/WWW/2000/10/swap/test/animal.rdf#
Not really a question but... RDFLib's RDF/XML parser at the moment
does not make it easy to get to the namespace binding information. And
the way sax2rdf currently calls bind it looks like there will be
issues if a prefix gets redefined. Here is a question re:
this... should passing the namespace information to the store be a
[mandatory] part of the interface? or does it cause to much grief in
practice not too?
TO RUN: (cwm with rdflib's rdf/xml parser)
Double check that you have rdflib-1.2.x installed :)
* Download from http://rdflib.net/stable/
* extract
* cd root of distribution
* python2.2 setup.py install
Change the following line in cwm.py from:
return sax2rdf.RDFXMLParser(...
to:
return rdflib2rdf.RDFXMLParser(...
--eikeon, http://eikeon.com/
"""
from RDFSink import FORMULA
import diag
from diag import progress
class ContextSink(object):
def __init__(self, sink, openFormula,
thisDoc=None, flags="", why=None):
self.sink = sink
assert thisDoc != None, "Need document URI at the moment, sorry"
self.thisDoc = thisDoc
self.formulaURI = formulaURI
self._context = openFormula
self._reason = why # Why the parser w
self._reason2 = None # Why these triples
if diag.tracking: self._reason2 = BecauseOfData(sink.newSymbol(thisDoc), because=self._reason)
def newSymbol(self, uri):
return self.sink.newSymbol(uri)
def newLiteral(self, s):
return self.sink.newLiteral(s)
def newXMLLiteral(self, s):
return self.sink.newXMLLiteral(s)
def newBlankNode(self):
return self.sink.newBlankNode(self._context)
def makeStatement(self, (predicate, subject, object)):
self.sink.makeStatement((self._context, predicate, subject, object), why=self._reason2)
import uripath
from rdflib.syntax.parser import ParserDispatcher
from rdflib.URIRef import URIRef
from rdflib.Literal import Literal
from rdflib.BNode import BNode
from rdflib.URLInputSource import URLInputSource
class RDFXMLParser:
def __init__(self, sink,
formulaURI, thisDoc, flags="", why=None):
self.__sink = ContextSink(sink,formulaURI, thisDoc, flags, why)
self.__bnodes = {}
def __convert(self, t):
"""Convert from rdflib to cwm style term."""
# For now, I have decided not to try and add factory arguments
# or some other such mechanism to rdflib's parser... but
# rather convert the resulting rdflib term objects to the
# desired types.
# It may just be the cleanest interface moving forward as
# well... as it removes the need to have to worry about the
# details of the information needing to be passed to the
# various constructors... for example, does the literal
# constructor take a value and a language... and what happens
# to the interface when datatype gets added. So in effect it
# seems just to be a higher level interface.
if isinstance(t, URIRef):
return self.__sink.newSymbol(str(t))
elif isinstance(t, Literal):
# return self.__sink.newLiteral(str(t))
return self.__sink.newLiteral(t) # t is subclass of unicode
elif isinstance(t, BNode):
bnodes = self.__bnodes
if t in bnodes:
return bnodes[t]
else:
bnode = self.__sink.newBlankNode()
bnodes[t] = bnode
return bnode
else:
raise Exception("Unexpected type")
def add(self, (s, p, o)):
"""Add triple to the sink (rdflib.syntax.parser.Parser calls
this method)."""
subject = self.__convert(s)
predicate = self.__convert(p)
object = self.__convert(o)
self.__sink.makeStatement((predicate, subject, object))
def feed(self, buffer):
self.parser(StringInputSource(buffer))
def load(self, uri, baseURI=""):
if uri:
uri = uripath.join(baseURI, uri) # Make abs from relative
source = URLInputSource(uri)
self.parse(source)
#ends
|