diff options
author | Lars-Dominik Braun <lars@6xq.net> | 2017-01-21 11:24:56 +0100 |
---|---|---|
committer | Lars-Dominik Braun <lars@6xq.net> | 2017-01-28 14:31:28 +0100 |
commit | a6d474471dddc2d7a187a66358aafcb86235ca69 (patch) | |
tree | 7242cbf0f0e645b2156e143dbebaa2d28b4fcdba /tools/rdf.py | |
parent | c7befe173ed2b0f5fd82228fa45c7a105ac44818 (diff) | |
download | eumel-a6d474471dddc2d7a187a66358aafcb86235ca69.tar.gz eumel-a6d474471dddc2d7a187a66358aafcb86235ca69.tar.bz2 eumel-a6d474471dddc2d7a187a66358aafcb86235ca69.zip |
Restructure git
Move tools into separate repo, split TTL file.
Diffstat (limited to 'tools/rdf.py')
-rw-r--r-- | tools/rdf.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tools/rdf.py b/tools/rdf.py new file mode 100644 index 0000000..6aaa682 --- /dev/null +++ b/tools/rdf.py @@ -0,0 +1,54 @@ +from rdflib.namespace import RDF, NamespaceManager + +class RDFWalker: + """ + Simple RDF graph walker + """ + + def __init__ (self, g, s, n, path=[]): + """ + :param g: Graph + :param s: Namespace + :param n: Start node + """ + self.g = g + self.n = n + self.s = s + self._path = path + + def __getattr__ (self, k): + """ + If k is underscore _, walk up tree one level, otherwise search for + direct descendents and get first one. + """ + if k == '_': + return RDFWalker (self.g, self.s, self._path[0], self._path[1:]) + yieldall = False + if k.endswith ('_'): + yieldall = True + k = k[:-1] + + if k == 'a': + attr = RDF.type + else: + attr = getattr (self.s, k) + + ret = [RDFWalker (self.g, self.s, n, [self.n] + self._path) for n in self.g.objects (self.n, attr)] + + if yieldall: + return ret + elif not ret: + return None + else: + return ret[0] + + def __eq__ (self, b): + return self.n == b.n + + def __lt__ (self, b): + return str (self) < str (b) + + def __str__ (self): + return str (self.n) + + |