Esempio n. 1
0
def RunQuery(
    subQueryJoin, bindings, factGraph, vars=None, debug=False, symmAtomicInclusion=False, specialBNodeHandling=None
):
    initialNs = hasattr(factGraph, "nsMap") and factGraph.nsMap or dict([(k, v) for k, v in factGraph.namespaces()])

    if not subQueryJoin:
        return False
    if not vars:
        vars = []
    if bool(bindings):
        # Apply a priori substitutions
        openVars, conjGroundLiterals, bindings = normalizeBindingsAndQuery(set(vars), bindings, subQueryJoin)
        vars = list(openVars)
    else:
        conjGroundLiterals = subQueryJoin
    isGround = not vars
    subquery = RDFTuplesToSPARQL(
        conjGroundLiterals, factGraph, isGround, [v for v in vars], symmAtomicInclusion, specialBNodeHandling
    )
    rt = factGraph.query(subquery, initNs=initialNs)  # ,
    # DEBUG = debug)
    projectedBindings = vars and project(bindings, vars) or bindings
    if isGround:
        if debug:
            _debug(
                "%s%s-> %s"
                % (
                    subquery,
                    projectedBindings and " %s apriori binding(s)" % len(projectedBindings) or "",
                    rt.askAnswer[0],
                )
            )
        return subquery, rt.askAnswer[0]
    else:
        rt = (
            len(vars) > 1
            and (
                dict(
                    [
                        (vars[idx], specialBNodeHandling[-1](i) if specialBNodeHandling and isinstance(i, BNode) else i)
                        for idx, i in enumerate(v)
                    ]
                )
                for v in rt
            )
            or (
                dict([(vars[0], specialBNodeHandling[-1](v) if specialBNodeHandling and isinstance(v, BNode) else v)])
                for v in rt
            )
        )
        if debug:
            _debug(
                "%s%s-> %s"
                % (
                    subquery,
                    projectedBindings and " %s apriori binding(s)" % len(projectedBindings) or "",
                    rt and "[]",
                )  # .. %s answers .. ]'%len(rt) or '[]')
            )
        return subquery, rt
Esempio n. 2
0
 def ground(self, mapping):
     appliedVars = set()
     for item in self.formulae:
         if isinstance(item, Or):
             for _item in item.formulae:
                 appliedVars.update(item.ground(mapping))
         else:
             appliedVars.update(item.ground(mapping))
     self.bindings = project(self.bindings, appliedVars, True)
     self.returnVars = self.getOpenVars()
     return appliedVars
Esempio n. 3
0
 def ground(self,mapping):
     appliedVars = set()
     for item in self.formulae:
         if isinstance(item,Or):
             for _item in item.formulae:
                 appliedVars.update(item.ground(mapping))
         else:
             appliedVars.update(item.ground(mapping))
     self.bindings = project(self.bindings,appliedVars,True)
     self.returnVars = self.getOpenVars()
     return appliedVars
Esempio n. 4
0
def RunQuery(subQueryJoin,
            bindings,
            factGraph,
            vars=None,
            debug = False,
            symmAtomicInclusion = False):
   initialNs = hasattr(factGraph,'nsMap') and factGraph.nsMap or \
               dict([(k,v) for k,v in factGraph.namespaces()])

   if not subQueryJoin:
       return False
   if not vars:
       vars=[]
   if bool(bindings):
       #Apply a priori substitutions
       openVars,conjGroundLiterals,bindings  = \
               normalizeBindingsAndQuery(set(vars),
                                         bindings,
                                         subQueryJoin)
       vars=list(openVars)
   else:
       conjGroundLiterals = subQueryJoin
   isGround = not vars
   subquery = RDFTuplesToSPARQL(conjGroundLiterals,
                                factGraph,
                                isGround,
                                [v for v in vars],
                                symmAtomicInclusion)
   rt = factGraph.query(subquery,
                        initNs = initialNs)#,
                        #DEBUG = debug)
   projectedBindings = vars and project(bindings,vars) or bindings
   if isGround:
       if debug:
           print >>sys.stderr, "%s%s-> %s"%(
                         subquery,
                         projectedBindings and 
                         " %s apriori binding(s)"%len(projectedBindings) or '',
                         rt.askAnswer[0])
       return subquery,rt.askAnswer[0]
   else:
       rt = len(vars)>1 and ( dict([(vars[idx],i) 
                                      for idx,i in enumerate(v)]) 
                                           for v in rt ) \
              or ( dict([(vars[0],v)]) for v in rt )
       if debug:
           print >>sys.stderr, "%s%s-> %s"%(
                   subquery,
                   projectedBindings and 
                   " %s apriori binding(s)"%len(projectedBindings) or '',                                
                   rt and '[]')# .. %s answers .. ]'%len(rt) or '[]')
       return subquery,rt
Esempio n. 5
0
def RunQuery(subQueryJoin,
             bindings,
             factGraph,
             vars=None,
             debug=False,
             symmAtomicInclusion=False):
    initialNs = hasattr(factGraph, 'nsMap') and factGraph.nsMap or \
        dict([(k, v) for k, v in factGraph.namespaces()])
    if not subQueryJoin:
        return False
    if not vars:
        vars = []
    if bool(bindings):
        # Apply a priori substitutions
        openVars, conjGroundLiterals, bindings = \
            normalizeBindingsAndQuery(set(vars),
                                      bindings,
                                      subQueryJoin)
        vars = list(openVars)
    else:
        conjGroundLiterals = subQueryJoin
    isGround = not vars
    subquery = RDFTuplesToSPARQL(conjGroundLiterals,
                                 factGraph,
                                 isGround,
                                 [v for v in vars],
                                 symmAtomicInclusion)
    rt = factGraph.query(subquery,
                         initNs=initialNs)  # DEBUG=debug)
    projectedBindings = vars and project(bindings, vars) or bindings
    if isGround:
        if debug:
            print("%s%s-> %s" % (
                subquery,
                projectedBindings and
                " %s apriori binding(s)" % len(projectedBindings) or '',
                rt.askAnswer[0]))
        return subquery, rt.askAnswer[0]
    else:
        rt = len(vars) > 1 and (dict([(vars[idx], i)
                                      for idx, i in enumerate(v)])
                                for v in rt) \
            or (dict([(vars[0], v)]) for v in rt)
        if debug:
            print("%s%s-> %s" % (
                subquery,
                projectedBindings and
                " %s apriori binding(s)" % len(projectedBindings) or '',
                rt and '[]'))  # .. %s answers .. ]'%len(rt) or '[]')
        return subquery, rt
Esempio n. 6
0
def normalizeBindingsAndQuery(vars, bindings, conjunct):
    """
    Takes a query in the form of a list of variables to bind to
    an a priori set of bindings and a conjunct of literals and applies the
    bindings returning:
     - The remaining variables that were not substituted
     - The (possibly grounded) conjunct of literals
     - The bindings minus mappings involving substituted variables

    """
    _vars = set(vars)
    bindingDomain = set(bindings.keys())
    appliedBindings = False
    if bindings:
        # Apply a priori substitutions
        for lit in conjunct:
            substitutedVars = bindingDomain.intersection(lit.toRDFTuple())
            lit.ground(bindings)
            if substitutedVars:
                appliedBindings = True
                _vars.difference_update(substitutedVars)
    return list(_vars), conjunct, project(bindings, _vars, inverse=True) if appliedBindings else bindings
Esempio n. 7
0
def normalizeBindingsAndQuery(vars, bindings, conjunct):
    """
    Takes a query in the form of a list of variables to bind to
    an a priori set of bindings and a conjunct of literals and applies the bindings
    returning:
     - The remaining variables that were not substituted
     - The (possibly grounded) conjunct of literals
     - The bindings minus mappings involving substituted variables

    """
    _vars = set(vars)
    bindingDomain = set(bindings.keys())
    appliedBindings = False
    if bindings:
        #Apply a priori substitutions
        for lit in conjunct:
            substitutedVars = bindingDomain.intersection(lit.toRDFTuple())
            lit.ground(bindings)
            if substitutedVars:
                appliedBindings = True
                _vars.difference_update(substitutedVars)
    return list(_vars), conjunct, \
           project(bindings, _vars, inverse=True) if appliedBindings else bindings
Esempio n. 8
0
 def accumulateBindings(self, bindings):
     """
     """
     self.bindings.update(
         project(bindings, self.getOpenVars(), inverse=True))
Esempio n. 9
0
def RunQuery(subQueryJoin,
             bindings,
             factGraph,
             vars=None,
             debug=False,
             symmAtomicInclusion=False,
             specialBNodeHandling=None,
             toldBNode=False):
    initialNs = hasattr(factGraph,'nsMap') and factGraph.nsMap or \
               dict([(k,v) for k,v in factGraph.namespaces()])

    if not subQueryJoin:
        return False
    if not vars:
        vars = []
    if bool(bindings):
        #Apply a priori substitutions
        openVars,conjGroundLiterals,bindings  = \
                normalizeBindingsAndQuery(set(vars),
                                          bindings,
                                          subQueryJoin)
        vars = list(openVars)
    else:
        conjGroundLiterals = subQueryJoin
    isGround = not vars
    subquery = RDFTuplesToSPARQL(conjGroundLiterals, factGraph, isGround,
                                 [v for v in vars], symmAtomicInclusion,
                                 specialBNodeHandling)

    if toldBNode:
        from rdflib.sparql.bison.Query import Prolog
        from rdflib.sparql.parser import parse
        parsedQuery = parse(subquery)
        if not parsedQuery.prolog:
            parsedQuery.prolog = Prolog(None, [])

        parsedQuery.prolog.toldBNodes = True
        subquery = ''
    else:
        parsedQuery = None

    rt = factGraph.query(subquery, initNs=initialNs, parsedQuery=parsedQuery)
    projectedBindings = vars and project(bindings, vars) or bindings
    if isGround:
        if debug:
            print >> sys.stderr, "%s%s-> %s" % (
                subquery, projectedBindings and " %s apriori binding(s)" %
                len(projectedBindings) or '', rt.askAnswer[0])
        return subquery, rt.askAnswer[0]
    else:
        rt = len(vars)>1 and (
         dict([(vars[idx],
                specialBNodeHandling[-1](i)
                if specialBNodeHandling and isinstance(i,BNode)
                else i)
                                       for idx,i in enumerate(v)])
                                            for v in rt ) \
               or ( dict([(vars[0],
                           specialBNodeHandling[-1](v)
                          if specialBNodeHandling and isinstance(v,BNode) else v)
                          ]) for v in rt )
        if debug:
            print >> sys.stderr, "%s%s-> %s" % (
                subquery, projectedBindings
                and " %s apriori binding(s)" % len(projectedBindings) or '', rt
                and '[]')  # .. %s answers .. ]'%len(rt) or '[]')
        return subquery, rt
Esempio n. 10
0
 def accumulateBindings(self, bindings):
     """
     """
     self.bindings.update(project(bindings,self.getOpenVars(),inverse=True))
Esempio n. 11
0
def RunQuery(subQueryJoin,
            bindings,
            factGraph,
            vars=None,
            debug = False,
            symmAtomicInclusion = False,
            specialBNodeHandling = None,
            toldBNode = False):
    initialNs = hasattr(factGraph,'nsMap') and factGraph.nsMap or \
               dict([(k,v) for k,v in factGraph.namespaces()])

    if not subQueryJoin:
        return False
    if not vars:
        vars=[]
    if bool(bindings):
        #Apply a priori substitutions
        openVars,conjGroundLiterals,bindings  = \
                normalizeBindingsAndQuery(set(vars),
                                          bindings,
                                          subQueryJoin)
        vars=list(openVars)
    else:
        conjGroundLiterals = subQueryJoin
    isGround = not vars
    subquery = RDFTuplesToSPARQL(conjGroundLiterals,
                                 factGraph,
                                 isGround,
                                 [v for v in vars],
                                 symmAtomicInclusion,
                                 specialBNodeHandling)

    if toldBNode:
        from rdflib.sparql.bison.Query import Prolog
        from rdflib.sparql.parser import parse
        parsedQuery = parse(subquery)
        if not parsedQuery.prolog:
            parsedQuery.prolog = Prolog(None, [])

        parsedQuery.prolog.toldBNodes = True
        subquery = ''
    else:
        parsedQuery = None

    rt = factGraph.query(subquery,
                         initNs = initialNs,
                         parsedQuery=parsedQuery)
    projectedBindings = vars and project(bindings,vars) or bindings
    if isGround:
        if debug:
            print >>sys.stderr, "%s%s-> %s"%(
                         subquery,
                         projectedBindings and 
                         " %s apriori binding(s)"%len(projectedBindings) or '',
                         rt.askAnswer[0])
        return subquery,rt.askAnswer[0]
    else:
        rt = len(vars)>1 and (
         dict([(vars[idx],
                specialBNodeHandling[-1](i)
                if specialBNodeHandling and isinstance(i,BNode)
                else i)
                                       for idx,i in enumerate(v)])
                                            for v in rt ) \
               or ( dict([(vars[0],
                           specialBNodeHandling[-1](v)
                          if specialBNodeHandling and isinstance(v,BNode) else v)
                          ]) for v in rt )
        if debug:
            print >>sys.stderr, "%s%s-> %s"%(
                   subquery,
                   projectedBindings and 
                   " %s apriori binding(s)"%len(projectedBindings) or '',                                
                   rt and '[]')# .. %s answers .. ]'%len(rt) or '[]')
        return subquery,rt