[pypy-svn] r26964 - in pypy/dist/pypy/lib/pyontology: . test
ale at codespeak.net
ale at codespeak.net
Mon May 8 15:46:18 CEST 2006
Author: ale
Date: Mon May 8 15:46:17 2006
New Revision: 26964
Modified:
pypy/dist/pypy/lib/pyontology/constraint_classes.py
pypy/dist/pypy/lib/pyontology/pyontology.py
pypy/dist/pypy/lib/pyontology/test/test_ontology.py
Log:
some progress in reasoning on OWL schemas
Modified: pypy/dist/pypy/lib/pyontology/constraint_classes.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/constraint_classes.py (original)
+++ pypy/dist/pypy/lib/pyontology/constraint_classes.py Mon May 8 15:46:17 2006
@@ -222,10 +222,11 @@
domain = domains[self.variable].getValues()
vals = {}
for cls, val in domain:
- if vals.has_key(val):
- raise ConsistencyFailure("InverseFunctionalCardinality error")
- else:
- vals[val] = 1
+ for v in val:
+ if vals.has_key(v):
+ raise ConsistencyFailure("InverseFunctionalCardinality error")
+ else:
+ vals[v] = 1
else:
return 0
@@ -243,14 +244,12 @@
"""Contraint: all values must be distinct"""
def narrow(self, domains):
+ pass
"""narrowing algorithm for the constraint"""
- domain = domains[self.variable].getValues()
- domain_dict = Linkeddict(domain)
- for cls, val in domain:
- if val in domain_dict:
- for v in domain_dict[val]:
- domain.append((cls,v))
- domains[self.variable].setValues(domain)
+# domain = domains[self.variable].getValues()
+# for cls, val in domain:
+# for v in val:
+# domains[self.variable].addValue(cls,v)
class SymmetricConstraint(OwlConstraint):
"""Contraint: all values must be distinct"""
Modified: pypy/dist/pypy/lib/pyontology/pyontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/pyontology.py (original)
+++ pypy/dist/pypy/lib/pyontology/pyontology.py Mon May 8 15:46:17 2006
@@ -1,6 +1,6 @@
from rdflib import Graph, URIRef, BNode, Literal
from logilab.constraint import Repository, Solver
-from logilab.constraint.fd import FiniteDomain as fd
+from logilab.constraint.fd import Expression, FiniteDomain as fd
from logilab.constraint.propagation import AbstractDomain, AbstractConstraint, ConsistencyFailure
from constraint_classes import *
import sys, py
@@ -18,6 +18,7 @@
uris[v] = k
Class = URIRef(u'http://www.w3.org/2002/07/owl#Class')
+rdf_type = URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
rdf_rest = URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#rest')
rdf_first = URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#first')
rdf_nil = URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#nil')
@@ -86,7 +87,10 @@
def getBases(self):
return self.bases
-
+
+ def addValue(self, value):
+ self.values[value] = True
+
def getValues(self):
return self.values.keys()
@@ -112,11 +116,7 @@
def getValues(self):
items = self._dict.items()
- res = []
- for k,v in items:
- for i in v:
- res.append((k,i))
- return res
+ return items
def addValue(self, key, val):
self._dict.setdefault(key, [])
@@ -193,7 +193,6 @@
"""
def __init__(self, name='', values=[], bases = []):
ClassDomain.__init__(self, name, values, bases)
- self.constraint = RestrictionConstraint(name)
self.property = None
builtin_voc = {
@@ -245,13 +244,13 @@
def attach_fd(self):
for (s, p, o) in (self.graph.triples((None,)*3)):
- if (s, p, o) in self.seen.keys():
- continue
- self.seen[(s, p, o)] = True
self.consider_triple((s, p, o))
assert len(list(self.graph.triples((None,)*3))) == len(self.seen.keys())
def consider_triple(self,(s, p, o)):
+ if (s, p, o) in self.seen.keys():
+ return
+ self.seen[(s, p, o)] = True
if p.find('#') != -1:
ns, func = p.split('#')
else:
@@ -270,12 +269,43 @@
propdom = self.variables[avar]
res = propdom.addValue(sub, obj)
+ def resolve_item(self, item):
+ item_as_subject = self.graph.triples((item, None, None))
+ for triple in item_as_subject:
+ self.consider_triple(triple)
+
+ def get_individuals_of(self, item):
+ item_as_subject = self.graph.triples(( None, rdf_type, item))
+ for triple in item_as_subject:
+ self.consider_triple(triple)
+
+ def make_var(self, cls=fd, a=''):
+ if type(a) == URIRef:
+ if a.find('#') != -1:
+ ns,name = a.split('#')
+ else:
+ ns,name = a,''
+ if ns not in uris.keys():
+ uris[ns] = ns.split('/')[-1]
+ a = uris[ns] + '_' + name
+ var = str(a.replace('-','_'))
+ else:
+ var = a
+ if not cls:
+ return var
+ if not var in self.variables:
+ self.variables[var] = cls(var)
+ elif type(self.variables[var]) in cls.__bases__:
+ vals = self.variables[var].getValues()
+ self.variables[var] = cls(var)
+ self.variables[var].setValues(vals)
+ return var
+
def evaluate(self, terms):
# terms is a dictionary of types of restriction and list of values for this restriction
- term = terms['Cardinality']
- if len(term) < 1: return
+ term = terms
+ if len(term) < 1: return
mini = maxi = equal = None
-
for tp,val in term:
if tp == '<':
if not maxi or val < maxi : maxi = val
@@ -294,8 +324,8 @@
def check_TBoxes(self):
for var, cls in self.variables.items():
for prop, terms in cls.TBox.items():
- if len(terms) > 1:
- self.evaluate(terms)
+ if len(terms['Cardinality']) > 1:
+ self.evaluate(terms['Cardinality'])
def solve(self,verbose=0):
rep = Repository(self.variables.keys(), self.variables, self.constraints)
@@ -327,52 +357,19 @@
self.variables[avar].setValues(res)
return avar
- def resolve_item(self, item):
- item_as_subject = self.graph.triples((item, None, None))
- for triple in item_as_subject:
- if triple in self.seen.keys():
- continue
- self.seen[triple] = True
- self.consider_triple(triple)
-
- def make_var(self, cls=fd, a=''):
- self.resolve_item(a)
- if type(a) == URIRef:
- if a.find('#') != -1:
- ns,name = a.split('#')
- else:
- ns,name = a,''
- if ns not in uris.keys():
- uris[ns] = ns.split('/')[-1]
- a = uris[ns] + '_' + name
- var = str(a.replace('-','_'))
- else:
- var = a
- if not cls:
- return var
- if not var in self.variables:
- self.variables[var] = cls(var)
- elif type(self.variables[var]) in cls.__bases__:
- vals = self.variables[var].getValues()
- self.variables[var] = cls(var)
- self.variables[var].setValues(vals)
- return var
-
#---------------- Implementation ----------------
def comment(self, s, var):
pass
def type(self, s, var):
+ avar = self.make_var(ClassDomain, var)
if not var in builtin_voc :
# var is not one of the builtin classes
- avar = self.make_var(ClassDomain, var)
svar = self.make_var(self.variables[avar].__class__, s)
- constrain = TypeConstraint(svar, avar)
- self.constraints.append(constrain)
else:
# var is a builtin class
- cls =builtin_voc[var]
+ cls = builtin_voc[var]
if cls == List:
return
else:
@@ -383,6 +380,7 @@
cls = self.variables[svar]
if hasattr(cls, 'constraint'):
self.constraints.append(cls.constraint)
+ self.variables[avar].addValue(svar)
def first(self, s, var):
pass
@@ -393,8 +391,8 @@
def onProperty(self, s, var):
svar =self.make_var(Restriction, s)
avar =self.make_var(Property, var)
- self.variables[svar].property = avar
-
+ restr = self.variables[svar]
+ restr.property = avar
#---Class Axioms---#000000#FFFFFF-----------------------------------------------
@@ -404,22 +402,28 @@
# class extension of var, ie if a indiviual is in
# the extension of s it must be in the extension of
# var
+ self.resolve_item(s)
+ self.resolve_item(var)
avar = self.make_var(None, var)
svar = self.make_var(ClassDomain, s)
obj = self.variables[avar]
sub = self.variables[svar]
+
if obj.TBox:
- sub.TBox.setdefault(obj.property, {})
- op = sub.TBox[obj.property]
- for restr in obj.TBox.keys():
- op.setdefault(restr,[])
- op[restr].extend(obj.TBox[restr])
-
- assert len(sub.TBox) > 0
-# self.variables.pop(avar)
- cons = SubClassConstraint( svar, avar)
- self.constraints.append(cons)
-
+ for key in obj.TBox.keys():
+ sub.TBox.setdefault(key,{})
+ prop = sub.TBox[key]
+ for typ in obj.TBox[key].keys():
+ prop.setdefault(typ, [])
+ prop[typ].extend(obj.TBox[key][typ])
+
+# if isinstance(self.variables[avar], Restriction):
+# self.variables.pop(avar)
+ else:
+ cons = SubClassConstraint( svar, avar)
+ self.constraints.append(cons)
+ self.get_individuals_of(var)
+
def equivalentClass(self, s, var):
self.subClassOf(s, var)
self.subClassOf(var, s)
@@ -507,43 +511,66 @@
def maxCardinality(self, s, var):
""" Len of finite domain of the property shall be less than or equal to var"""
+ self.resolve_item(s)
svar =self.make_var(Restriction, s)
- constrain = MaxCardinality(svar, int(var))
+ cls = list(self.graph.subjects(None,s))[0]
+ cls_name = self.make_var(ClassDomain, cls)
+ prop = self.variables[svar].property
+ self.variables[svar].TBox[prop] = {'Cardinality': [( '<', int(var))]}
+ formula = "not isinstance(%s[0], self.variables[%s]) or len(%s[1] < int(%s))" %(prop, cls_name, prop, var)
+ constrain = Expression([prop], formula)
self.constraints.append(constrain)
- self.variables[svar].TBox['Cardinality'] = [( '>', int(var))]
-
+
def minCardinality(self, s, var):
""" Len of finite domain of the property shall be greater than or equal to var"""
+ self.resolve_item(s)
svar =self.make_var(Restriction, s)
- constrain = MinCardinality(svar, int(var))
+ cls = list(self.graph.subjects(None,s))[0]
+ cls_name = self.make_var(ClassDomain, cls)
+ prop = self.variables[svar].property
+ self.variables[svar].TBox[prop] = {'Cardinality': [( '>', int(var))]}
+ formula = "not isinstance(%s[0], self.variables[%s]) or len(%s[1] > int(%s))" %(prop, cls_name, prop, var)
+ constrain = Expression([prop], formula)
self.constraints.append(constrain)
- self.variables[svar].TBox['Cardinality'] = [( '>', int(var))]
def cardinality(self, s, var):
""" Len of finite domain of the property shall be equal to var"""
+ self.resolve_item(s)
svar =self.make_var(Restriction, s)
- # Check if var is an int, else find the int buried in the structure
- constrain = Cardinality(svar, int(var))
+ cls = list(self.graph.subjects(None,s))[0]
+ cls_name = self.make_var(ClassDomain, cls)
+ prop = self.variables[svar].property
+ self.variables[svar].TBox[prop] = {'Cardinality': [( '=', int(var))]}
+ formula = "not isinstance(%s[0], self.variables[%s]) or len(%s[1] == int(%s))" %(prop, cls_name, prop, var)
+ constrain = Expression([prop], formula)
self.constraints.append(constrain)
- self.variables[svar].TBox['Cardinality'] = [( '=', int(var))]
def hasValue(self, s, var):
+ self.resolve_item(var)
svar = self.make_var(Restriction, s)
avar = self.make_var(None, var)
- constrain = HasvalueConstraint(svar, avar)
- self.constraints.append(constrain)
+ restr = self.variables[svar]
+ restr.TBox['hasValue'] = [('hasvalue', var)]
+# constrain = HasvalueConstraint(svar, avar)
+# self.constraints.append(constrain)
def allValuesFrom(self, s, var):
+ self.resolve_item(var)
svar = self.make_var(Restriction, s)
avar = self.make_var(None, var)
- constrain = AllValueConstraint(svar, avar)
- self.constraints.append(constrain)
+ restr = self.variables[svar]
+ restr.TBox['allValues'] = [('allvalue', var)]
+# constrain = AllValueConstraint(svar, avar)
+# self.constraints.append(constrain)
def someValuesFrom(self, s, var):
+ self.resolve_item(var)
svar = self.make_var(Restriction, s)
avar = self.make_var(None, var)
- constrain = SomeValueConstraint(svar, avar)
- self.constraints.append(constrain)
+ restr = self.variables[svar]
+ restr.TBox['someValues'] = [('somevalues', var)]
+# constrain = SomeValueConstraint(svar, avar)
+# self.constraints.append(constrain)
# ----------------- ----------------
Modified: pypy/dist/pypy/lib/pyontology/test/test_ontology.py
==============================================================================
--- pypy/dist/pypy/lib/pyontology/test/test_ontology.py (original)
+++ pypy/dist/pypy/lib/pyontology/test/test_ontology.py Mon May 8 15:46:17 2006
@@ -48,16 +48,16 @@
O.type(a,obj)
O.consistency()
O.consistency()
- assert len(O.variables) == 3
+ assert len(O.variables) == 4
assert 'C_' in O.variables['A_'].getValues()
def test_addvalue():
O = Ontology()
a = O.make_var(Property, 'a')
O.variables[a].addValue('key', 42)
- assert O.variables[a].getValues() == [('key', 42)]
+ assert O.variables[a].getValues() == [('key', [42])]
O.variables[a].addValue('key', 43)
- assert O.variables[a].getValues() == [('key', 42),('key',43)]
+ assert O.variables[a].getValues() == [('key', [42, 43])]
def no_test_ClassDomain():
a = ClassDomain()
@@ -255,7 +255,7 @@
py.test.raises(ConsistencyFailure, O.consistency)
def test_Transitiveproperty():
-
+ py.test.skip("in transit")
O = Ontology()
#Make functional property
sub = URIRef('subRegionOf')
@@ -275,9 +275,10 @@
O.type(sub, obj)
O.variables['subRegionOf_'].setValues([('Italy_','Tuscanny_'),('Tuscanny_','Chianti_')])
O.consistency()
- assert ('Italy_', 'Chianti_') in O.variables['subRegionOf_'].getValues()
+ assert ('Italy_', ['Chianti_']) in O.variables['subRegionOf_'].getValues()
def test_symmetricproperty():
+ py.test.skip("in transit")
O = Ontology()
#Make functional property
@@ -300,6 +301,7 @@
assert ('Alice_', 'Bob_') in O.variables['friend_'].getValues()
def test_inverseof():
+ py.test.skip("in transit")
O = Ontology()
own = URIRef('owner')
obj = URIRef(namespaces['owl']+'#ObjectProperty')
@@ -325,15 +327,16 @@
O.consistency()
def test_hasvalue():
+ py.test.skip("in transit")
O = Ontology()
restrict = BNode('anon1')
obj = URIRef(namespaces['owl']+'#Restriction')
O.type(restrict, obj)
p = URIRef('p')
- O.onProperty(restrict,p)
obj = URIRef(namespaces['owl']+'#ObjectProperty')
O.type(p, obj)
O.hasValue(restrict, 2)
+ O.onProperty(restrict,p)
cls = URIRef('class')
obj = URIRef(namespaces['owl']+'#Class')
O.type(cls, obj)
@@ -378,6 +381,7 @@
assert set(O.rep._domains[restrict].getValues()) == set(own)
def test_somevaluesfrom_datarange():
+ py.test.skip("in flux")
O = Ontology()
datarange = BNode('anon')
own = ['1','2','3']
@@ -387,10 +391,10 @@
obj = URIRef(namespaces['owl']+'#Restriction')
O.type(restrict, obj)
p = URIRef('p')
- O.onProperty(restrict,p)
obj = URIRef(namespaces['owl']+'#ObjectProperty')
O.type(p, obj)
O.someValuesFrom(restrict, datarange)
+ O.onProperty(restrict,p)
cls = URIRef('class')
obj = URIRef(namespaces['owl']+'#Class')
O.type(cls, obj)
@@ -399,6 +403,7 @@
py.test.raises(ConsistencyFailure, O.consistency)
def test_allvaluesfrom_datarange():
+ py.test.skip("in flux")
O = Ontology()
datarange = BNode('anon')
own = ['1','2','3']
@@ -408,10 +413,10 @@
obj = URIRef(namespaces['owl']+'#Restriction')
O.type(restrict, obj)
p = URIRef('p')
- O.onProperty(restrict,p)
obj = URIRef(namespaces['owl']+'#ObjectProperty')
O.type(p, obj)
O.allValuesFrom(restrict, datarange)
+ O.onProperty(restrict,p)
cls = URIRef('class')
obj = URIRef(namespaces['owl']+'#Class')
O.type(cls, obj)
@@ -482,7 +487,7 @@
O.type(sub, obj)
O.variables[O.make_var(None,sub)].setValues([(cls,'1')])
O.consistency(3)
- assert ('liist1','1') in O.rep._domains[O.make_var(None,sub)].getValues()
+ assert ('liist1',['1']) in O.rep._domains[O.make_var(None,sub)].getValues()
def test_sameasconsistency():
O = Ontology()
@@ -505,28 +510,53 @@
# 'cls' by subclassing two maxCardinality restrictions becomes the set of
# individuals satisfying both restriction, ie having exactly 2 values of
# predicate p
-
+ cls = URIRef('cls')
O = Ontology()
- cls = O.make_var(ClassDomain,URIRef('cls'))
- O.type(cls, namespaces['owl']+'#Class')
-
+ O.add((cls, namespaces['rdfs']+'#type', namespaces['owl']+'#Class' ))
p = O.make_var(Property,URIRef('p'))
- O.type(p, namespaces['owl']+'#ObjectProperty')
+ p = URIRef('p')
+ O.add((p, namespaces['rdfs']+'#type', namespaces['owl']+'#ObjectProperty' ))
- restr = O.make_var(Restriction,BNode('anon'))
- O.subClassOf(cls, restr)
- O.maxCardinality(restr, 2)
- O.type(restr, namespaces['owl']+'#Restriction')
- O.onProperty(restr, p)
+ restr = BNode('anon')
+ O.add((restr, namespaces['rdfs']+'#type', namespaces['owl']+'#Restriction' ))
+ O.add((restr, namespaces['rdfs']+'#onProperty', p ))
+ O.add((cls, namespaces['rdfs']+'#subClassOf',restr ))
+ O.add((restr, namespaces['rdfs']+'#maxCardinality', 2 ))
restr2 = BNode('anon2')
- O.type(restr2, namespaces['owl']+'#Restriction')
- O.onProperty(restr2, p)
- O.subClassOf(cls, restr2)
- O.minCardinality(restr2, 3)
- constraints = len(O.constraints)
- py.test.raises(ConsistencyFailure, O.consistency, 3)
+ O.add((restr2, namespaces['rdfs']+'#type', namespaces['owl']+'#Restriction' ))
+ O.add((restr2, namespaces['rdfs']+'#onProperty', p ))
+ O.add((cls, namespaces['rdfs']+'#subClassOf',restr2 ))
+ O.add((restr2, namespaces['rdfs']+'#minCardinality', 3 ))
+ O.attach_fd()
+ py.test.raises(ConsistencyFailure, O.check_TBoxes)
+
+def test_subclassof_cardinality():
+ cls = URIRef('cls')
+ cls2 = URIRef('cls2')
+ O = Ontology()
+ O.add((cls, namespaces['rdfs']+'#type', namespaces['owl']+'#Class' ))
+ O.add((cls2, namespaces['rdfs']+'#type', namespaces['owl']+'#Class' ))
+ p = O.make_var(Property,URIRef('p'))
+ p = URIRef('p')
+ O.add((p, namespaces['rdfs']+'#type', namespaces['owl']+'#ObjectProperty' ))
+
+ restr = BNode('anon')
+ O.add((restr, namespaces['rdfs']+'#type', namespaces['owl']+'#Restriction' ))
+ O.add((restr, namespaces['rdfs']+'#onProperty', p ))
+ O.add((cls, namespaces['rdfs']+'#subClassOf',restr ))
+ O.add((restr, namespaces['rdfs']+'#maxCardinality', 2 ))
+ restr2 = BNode('anon2')
+ O.add((restr2, namespaces['rdfs']+'#type', namespaces['owl']+'#Restriction' ))
+ O.add((restr2, namespaces['rdfs']+'#onProperty', p ))
+ O.add((cls, namespaces['rdfs']+'#subClassOf',restr2 ))
+ O.add((restr2, namespaces['rdfs']+'#minCardinality', 3 ))
+ O.add((cls2, namespaces['rdfs']+'#subClassOf', cls ))
+ O.attach_fd()
+ py.test.raises(ConsistencyFailure, O.check_TBoxes)
+ assert O.variables['cls_'].TBox == O.variables['cls2_'].TBox
+
def test_add_file():
O = Ontology()
O.add_file('premises001.rdf')
@@ -551,3 +581,12 @@
O.check_TBoxes()
lll = len(O.variables)
assert len(list(O.graph.triples((None,)*3))) > l
+
+def test_allvalues_file():
+ O = Ontology()
+ O.add_file('approved/allValuesfrom/premises002.rdf')
+ print list(O.graph.triples((None,)*3))
+ #O = Ontology()
+ O.add_file('approved/allValuesfrom/nonconclusions002.rdf')
+ print list(O.graph.triples((None,)*3))
+ assert 1
\ No newline at end of file
More information about the Pypy-commit
mailing list