from sets import Set
from pychinko.rete import RuleCompiler, Rete
from pychinko.interpreter import Interpreter
from pychinko.terms import URI, Rule, Variable, Fact, Pattern, Literal
from pychinko.simplequery import QueryN3Sink, SimpleQueryEvaluator
from pychinko.pychinkafon import N3Sink, N3Parser
from pychinko.nodes import RuleNode
from pychinko.helpers import keysToList
from rdflib.TripleStore import TripleStore
import unittest
import time
class QueryTests(unittest.TestCase):
"""I test Pychinko's querying facilities"""
def setUp(self):
self.store = TripleStore()
t = time.time()
self.store.load('groundtests/rdfig/small-rdfig1.rdf')
self.ReportLoadTime(t, self.store)
self.querier = SimpleQueryEvaluator(self.store)
def ReportLoadTime(self, t, store):
print 'Time to load:', time.time() - t
print 'Size of store:', len(store)
def ReportHits(self, t, rows):
print 'Number of hits:', len(rows)
print 'Pychinko query time:', time.time() - t
def testOneVarQuery(self):
"""I test a one variable match query"""
oneVarQuery = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
"""
#must be 120 matches
self.assert_(len(self.querier.queryFromString(oneVarQuery)), 120)
def testMultiVarQuery(self):
"""I test queries with multiple variables"""
multiVarQuery1 = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
?y dc:creator ?c.
?c foaf:nick ?z.
"""
multiVarQuery2 = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
?y dc:creator ?c.
?c foaf:nick "bijanp".
"""
#must be 120 matches here too
self.assertEqual(len(self.querier.queryFromString(multiVarQuery1)), 120)
self.assertEqual(len(self.querier.queryFromString(multiVarQuery2)), 2)
def testBuiltinQueries(self):
"""I test queries that make use of CWM's builtins"""
builtinQuery1 = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
?y dc:creator ?c.
?c foaf:nick ?z.
?z string:contains "bij".
"""
self.assertEqual(len(self.querier.queryFromString(builtinQuery1)), 2)
builtinQuery2 = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
?y dc:creator ?c.
?c foaf:nick ?z.
?z string:contains "russellparadox".
"""
self.assertEqual(len(self.querier.queryFromString(builtinQuery2)), 0)
builtinQuery3 = """
@prefix wn: .
@prefix foaf: .
@prefix dc: .
@prefix string: .
@prefix math: .
?y dc:date ?a.
?y dc:creator ?c.
?c foaf:nick ?z.
?z string:startsWith "b".
"""
self.assertEqual(len(self.querier.queryFromString(builtinQuery3)), 5)
if __name__ == "__main__":
print "Running query tests.."
unittest.main()