view service/reasoning/graphop.py @ 854:1815d2343a3f

cleanup Ignore-this: 5daf1af90686860062cb65a6dfc6526a darcs-hash:20121231221322-312f9-7517b28ae0662c20f31992743902ecaa8326d5a5
author drewp <drewp@bigasterisk.com>
date Mon, 31 Dec 2012 14:13:22 -0800
parents 39857f82922e
children 7179284779fd
line wrap: on
line source

import logging
from rdflib import URIRef, ConjunctiveGraph
log = logging.getLogger()

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