summaryrefslogtreecommitdiff
path: root/tools/rdf.py
diff options
context:
space:
mode:
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)
+
+