summaryrefslogtreecommitdiff
path: root/tools/rdf.py
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2017-01-21 11:24:56 +0100
committerLars-Dominik Braun <lars@6xq.net>2017-01-28 14:31:28 +0100
commita6d474471dddc2d7a187a66358aafcb86235ca69 (patch)
tree7242cbf0f0e645b2156e143dbebaa2d28b4fcdba /tools/rdf.py
parentc7befe173ed2b0f5fd82228fa45c7a105ac44818 (diff)
downloadeumel-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.py54
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)
+
+