comparison service/reasoning/inference.py @ 825:fc753b24f69a

move reasoning from /my/proj/room, new integration with magma Ignore-this: 5c5551d566324f5a6e87f6f7623f3c3 darcs-hash:20120207104522-312f9-f9c6e106e4434d65498c0f12acd01889676653b5.gz
author drewp <drewp@bigasterisk.com>
date Tue, 07 Feb 2012 02:45:22 -0800
parents
children 5b0f970e3d52
comparison
equal deleted inserted replaced
824:de21ca2f75c7 825:fc753b24f69a
1 """
2 see ./reasoning for usage
3 """
4
5 import sys, re
6 import restkit
7 from rdflib import StringInputSource, URIRef
8 from rdflib.Graph import Graph
9
10 sys.path.append("/my/proj/room/fuxi/build/lib.linux-x86_64-2.6")
11 from FuXi.Rete.Util import generateTokenSet
12 from FuXi.Rete import ReteNetwork
13 from rdflib import plugin
14 from rdflib.store import Store
15
16 def parseTrig(trig):
17 """
18 yields quads
19 """
20 m = re.match(r"<([^>]+)> \{(.*)\}\s*$", trig, re.DOTALL)
21 if m is None:
22 raise NotImplementedError("trig format was too tricky: %r..." % trig[:200])
23
24 ctx = URIRef(m.group(1))
25 n3 = m.group(2)
26 g = Graph()
27 g.parse(StringInputSource(n3), format="n3")
28 for stmt in g:
29 yield stmt + (ctx,)
30
31 def infer(graph, rules):
32 """
33 returns new graph of inferred statements
34 """
35 # based on fuxi/tools/rdfpipe.py
36 store = plugin.get('IOMemory',Store)()
37 store.open('')
38
39 target = Graph()
40 tokenSet = generateTokenSet(graph)
41 network = ReteNetwork(rules, inferredTarget=target)
42 network.feedFactsToAdd(tokenSet)
43
44 store.rollback()
45 return target
46
47 import time, logging
48 log = logging.getLogger()
49 def logTime(func):
50 def inner(*args, **kw):
51 t1 = time.time()
52 try:
53 ret = func(*args, **kw)
54 finally:
55 log.info("Call to %s took %.1f ms" % (
56 func.__name__, 1000 * (time.time() - t1)))
57 return ret
58 return inner
59
60 def addTrig(graph, url):
61 trig = restkit.request(url).body_string()
62 graph.addN(parseTrig(trig))