diff service/reasoning/graphop.py @ 853:39857f82922e

refactor graph ops Ignore-this: 60494d1602278528c51f138d6e56c32c darcs-hash:20121231204758-312f9-4f3382463757a6f17d0409905922a42207cad987
author drewp <drewp@bigasterisk.com>
date Mon, 31 Dec 2012 12:47:58 -0800
parents
children 0aeb8d6ea124
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/reasoning/graphop.py	Mon Dec 31 12:47:58 2012 -0800
@@ -0,0 +1,38 @@
+
+def graphWithoutMetadata(g, ignorePredicates=[]):
+    """
+    graph filter that removes any statements whose subjects are
+    contexts in the graph and also any statements with the given
+    predicates
+    """
+    ctxs = map(URIRef, set(g.contexts())) # weird they turned to strings
+
+    out = ConjunctiveGraph()
+    for stmt in g.quads((None, None, None)):
+        if stmt[0] not in ctxs and stmt[1] not in ignorePredicates:
+            out.addN([stmt])
+    return out
+
+def graphEqual(a, b, ignorePredicates=[]):
+    """
+    compare graphs, omitting any metadata statements about contexts
+    (especially modification times) and also any statements using the
+    given predicates
+    """
+    stmtsA = set(graphWithoutMetadata(a, ignorePredicates))
+    stmtsB = set(graphWithoutMetadata(b, ignorePredicates))
+    if stmtsA == stmtsB:
+        return True
+    
+    if log.getEffectiveLevel() <= logging.INFO:
+        lost = stmtsA - stmtsB
+        if lost:
+            log.info("lost statements:")
+            for s in lost:
+                log.info("  %s", s)
+        new = stmtsB - stmtsA
+        if new:
+            log.info("new statements:")
+            for s in new:
+                log.info("  %s", s)
+    return False