comparison planemo/lib/python3.7/site-packages/rdflib/plugins/sparql/evalutils.py @ 1:56ad4e20f292 draft

"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
author guerler
date Fri, 31 Jul 2020 00:32:28 -0400
parents
children
comparison
equal deleted inserted replaced
0:d30785e31577 1:56ad4e20f292
1 import collections
2
3 from rdflib.term import Variable, Literal, BNode, URIRef
4
5 from rdflib.plugins.sparql.operators import EBV
6 from rdflib.plugins.sparql.parserutils import Expr, CompValue, value
7 from rdflib.plugins.sparql.sparql import SPARQLError, NotBoundError
8
9
10 def _diff(a, b, expr):
11 res = set()
12
13 for x in a:
14 if all(not x.compatible(y) or not _ebv(expr, x.merge(y)) for y in b):
15 res.add(x)
16
17 return res
18
19
20 def _minus(a, b):
21 for x in a:
22 if all((not x.compatible(y)) or x.disjointDomain(y) for y in b):
23 yield x
24
25
26
27 def _join(a, b):
28 for x in a:
29 for y in b:
30 if x.compatible(y):
31 yield x.merge(y)
32
33
34 def _ebv(expr, ctx):
35
36 """
37 Return true/false for the given expr
38 Either the expr is itself true/false
39 or evaluates to something, with the given ctx
40
41 an error is false
42 """
43
44 try:
45 return EBV(expr)
46 except SPARQLError:
47 pass
48 if isinstance(expr, Expr):
49 try:
50 return EBV(expr.eval(ctx))
51 except SPARQLError:
52 return False # filter error == False
53 elif isinstance(expr, CompValue):
54 raise Exception(
55 "Weird - filter got a CompValue without evalfn! %r" % expr)
56 elif isinstance(expr, Variable):
57 try:
58 return EBV(ctx[expr])
59 except:
60 return False
61 return False
62
63
64 def _eval(expr, ctx, raise_not_bound_error=True):
65 if isinstance(expr, (Literal, URIRef)):
66 return expr
67 if isinstance(expr, Expr):
68 return expr.eval(ctx)
69 elif isinstance(expr, Variable):
70 try:
71 return ctx[expr]
72 except KeyError:
73 if raise_not_bound_error:
74 raise NotBoundError("Variable %s is not bound" % expr)
75 else:
76 return None
77 elif isinstance(expr, CompValue):
78 raise Exception(
79 "Weird - _eval got a CompValue without evalfn! %r" % expr)
80 else:
81 raise Exception("Cannot eval thing: %s (%s)" % (expr, type(expr)))
82
83
84 def _filter(a, expr):
85 for c in a:
86 if _ebv(expr, c):
87 yield c
88
89
90 def _fillTemplate(template, solution):
91
92 """
93 For construct/deleteWhere and friends
94
95 Fill a triple template with instantiated variables
96 """
97
98 bnodeMap = collections.defaultdict(BNode)
99 for t in template:
100 s, p, o = t
101
102 _s = solution.get(s)
103 _p = solution.get(p)
104 _o = solution.get(o)
105
106 # instantiate new bnodes for each solution
107 _s, _p, _o = [bnodeMap[x] if isinstance(
108 x, BNode) else y for x, y in zip(t, (_s, _p, _o))]
109
110 if _s is not None and \
111 _p is not None and \
112 _o is not None:
113
114 yield (_s, _p, _o)
115
116 def _val(v):
117 """ utilitity for ordering things"""
118 if isinstance(v, Variable):
119 return (0, v)
120 elif isinstance(v, BNode):
121 return (1, v)
122 elif isinstance(v, URIRef):
123 return (2, v)
124 elif isinstance(v, Literal):
125 return (3, v)