3
d#             %   @   sF  d dl mZ d dl mZ d dl mZ d dlmZ dZd dlZd dlm	Z	m
Z
mZmZmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlZejeZddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2g%Z G d3d4 d4Z!ed5Z"d6eee"ed7d8d9Z#d:d( Z$d;d# Z%d<d" Z&d=d0 Z'ded?d,Z(d@d) Z)dAd2 Z*G dBdC dCZ+G dDd* d*e,Z-edEZ.G dFd de-Z/G dGd- d-e/Z0dHd Z1dId Z2G dJd! d!eZ3e4e"j5j6e"j7e"j8e"j9e"j:e"j;e"j<e"j=e"j>e"j?e"j@e"jAe"jBgZCdKd% ZDdLd& ZEG dMd+ d+eFZGdfdNdZHG dOd  d e/ZIG dPd. d.e,ZJG dQd' d'eJeIZKe"jAe"j@gZLG dRdS dSZMG dTd dZNG dUd deJeIZOdVd ZPG dWd1 d1eIZQe!dXdY ZRe!dZdY ZSe!d[dY ZTe!d\dY ZUe!d]dY ZVe!d^dY ZWd_ZXG d`d/ d/e/ZYi fdad$ZZdbdc Z[eddkrBe[  dS )g    )absolute_import)division)print_function)PY3a  
RDFLib Python binding for OWL Abstract Syntax

see: http://www.w3.org/TR/owl-semantics/syntax.html
     http://owl-workshop.man.ac.uk/acceptedLong/submission_9.pdf

3.2.3 Axioms for complete classes without using owl:equivalentClass

Named class description of type 2 (with owl:oneOf) or type 4-6
(with owl:intersectionOf, owl:unionOf or owl:complementOf


Uses Manchester Syntax for __repr__

>>> exNs = Namespace('http://example.com/')
>>> namespace_manager = NamespaceManager(Graph())
>>> namespace_manager.bind('ex', exNs, override=False)
>>> namespace_manager.bind('owl', OWL_NS, override=False)
>>> g = Graph()
>>> g.namespace_manager = namespace_manager

Now we have an empty graph, we can construct OWL classes in it
using the Python classes defined in this module

>>> a = Class(exNs.Opera, graph=g)

Now we can assert rdfs:subClassOf and owl:equivalentClass relationships
(in the underlying graph) with other classes using the 'subClassOf'
and 'equivalentClass' descriptors which can be set to a list
of objects for the corresponding predicates.

>>> a.subClassOf = [exNs.MusicalWork]

We can then access the rdfs:subClassOf relationships

>>> print(list(a.subClassOf))
[Class: ex:MusicalWork ]

This can also be used against already populated graphs:

>>> owlGraph = Graph().parse(OWL_NS) #doctest: +SKIP
>>> namespace_manager.bind('owl', OWL_NS, override=False) #doctest: +SKIP
>>> owlGraph.namespace_manager = namespace_manager #doctest: +SKIP
>>> list(Class(OWL_NS.Class, graph=owlGraph).subClassOf) #doctest: +SKIP
[Class: rdfs:Class ]

Operators are also available. For instance we can add ex:Opera to the extension
of the ex:CreativeWork class via the '+=' operator

>>> a #doctest: +SKIP
Class: ex:Opera SubClassOf: ex:MusicalWork
>>> b = Class(exNs.CreativeWork, graph=g)
>>> b += a
>>> print(sorted(a.subClassOf, key=lambda c:c.identifier)) #doctest: +SKIP
[Class: ex:CreativeWork , Class: ex:MusicalWork ]

And we can then remove it from the extension as well

>>> b -= a
>>> a #doctest: +SKIP
Class: ex:Opera SubClassOf: ex:MusicalWork

Boolean class constructions can also  be created with Python operators.
For example, The | operator can be used to construct a class consisting of a
owl:unionOf the operands:

>>> c =  a | b | Class(exNs.Work, graph=g)
>>> c #doctest: +SKIP
( ex:Opera OR ex:CreativeWork OR ex:Work )

Boolean class expressions can also be operated as lists (using python list
operators)

>>> del c[c.index(Class(exNs.Work, graph=g))]
>>> c #doctest: +SKIP
( ex:Opera OR ex:CreativeWork )

The '&' operator can be used to construct class intersection:

>>> woman = Class(exNs.Female, graph=g) & Class(exNs.Human, graph=g)
>>> woman.identifier = exNs.Woman
>>> woman #doctest: +SKIP
( ex:Female AND ex:Human )
>>> len(woman)
2

Enumerated classes can also be manipulated

>>> contList = [Class(exNs.Africa, graph=g), Class(exNs.NorthAmerica, graph=g)]
>>> EnumeratedClass(members=contList, graph=g) #doctest: +SKIP
{ ex:Africa ex:NorthAmerica }

owl:Restrictions can also be instantiated:

>>> Restriction(exNs.hasParent, graph=g, allValuesFrom=exNs.Human) #doctest: +SKIP
( ex:hasParent ONLY ex:Human )

Restrictions can also be created using Manchester OWL syntax in 'colloquial'
Python
>>> exNs.hasParent | some | Class(exNs.Physician, graph=g) #doctest: +SKIP
( ex:hasParent SOME ex:Physician )

>>> Property(exNs.hasParent,graph=g) | max | Literal(1) #doctest: +SKIP
( ex:hasParent MAX 1 )

>>> print(g.serialize(format='pretty-xml')) #doctest: +SKIP

N)BNodeLiteral	NamespaceRDFRDFSURIRefVariable)Graph)
Collection)XSD)NamespaceManager)
Identifier)firstOWL_NSnsBindsACE_NSCLASS_RELATIONSsomeonlymaxminexactlyvaluePropertyAbstractSyntax
AllClassesAllDifferentAllPropertiesAnnotatableTermsBooleanClassCallable	CastClassClassClassNamespaceFactoryclassOrIdentifierclassOrTermCommonNSBindingsComponentTermsDeepClassClearEnumeratedClassgenerateQNameGetIdentifiedClasses
IndividualMalformedClassmanchesterSyntaxOntologyOWLRDFListProxyPropertypropertyOrIdentifierRestrictiontermDeletionDecoratorc               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )Infixc             C   s
   || _ d S )N)function)selfr9    r;   8/tmp/pip-build-7vycvbft/rdflib/rdflib/extras/infixowl.py__init__   s    zInfix.__init__c             C   s   t | |fddS )Nc             S   s   |j || S )N)r9   )xr:   otherr;   r;   r<   <lambda>   s    zInfix.__ror__.<locals>.<lambda>)r8   )r:   r?   r;   r;   r<   __ror__   s    zInfix.__ror__c             C   s
   | j |S )N)r9   )r:   r?   r;   r;   r<   __or__   s    zInfix.__or__c             C   s   t | |fddS )Nc             S   s   |j || S )N)r9   )r>   r:   r?   r;   r;   r<   r@      s    z#Infix.__rlshift__.<locals>.<lambda>)r8   )r:   r?   r;   r;   r<   __rlshift__   s    zInfix.__rlshift__c             C   s
   | j |S )N)r9   )r:   r?   r;   r;   r<   
__rshift__   s    zInfix.__rshift__c             C   s   | j ||S )N)r9   )r:   Zvalue1Zvalue2r;   r;   r<   __call__   s    zInfix.__call__N)	__name__
__module____qualname__r=   rA   rB   rC   rD   rE   r;   r;   r;   r<   r8      s   r8   zhttp://www.w3.org/2002/07/owl#z$http://www.w3.org/2004/02/skos/core#z$http://www.w3.org/2000/10/swap/list#z http://purl.org/dc/elements/1.1/)Zskosrdfrdfsowllistdcc             C   s"   | j t|\}}}dj||gS )N:)compute_qnamer'   join)graphuriprefix	localNamer;   r;   r<   r-      s    c             C   s,   t | tr| jS t | tttfs$t| S d S )N)
isinstancer%   
identifierr   r   r   AssertionError)thingr;   r;   r<   r(      s    
c             C   s6   t | ttfr| jS t | ttfs.td|  | S d S )Nz8Expecting a Class, Property, URIRef, or BNode.. not a %s)rU   r4   r%   rV   r   r   rW   )rX   r;   r;   r<   r'      s
    
c             C   s&   t | tr| jS t | tst| S d S )N)rU   r4   rV   r   rW   )rX   r;   r;   r<   r5      s    
Fc                s  | dk	st |r|r2t| } fdd| D }n&tt | } fddt | D }|tjkr.g }g }x,|D ]$}t|tr|j| qr|j| qrW |r fdd}	t|dkrdd	j	t
|	| d
 }
nt|d  }
|r
t|
d d	j	 fdd|D  S |
S ndd	j	dd |D  d
 S n`|tjkrVddj	dd |D  d
 S |tjkr~ddj	dd |D  d S |tjkst n<tj j| tjdkrt j| tjdd } j|\}
}}dj	|
|g}t j|tjd}|rd| }x( j| tjdD ]}d|t| f S W x( j| tjdD ]}d|t| f S W x( j| tjdD ]}d|t| f S W tjdtjdtjdi}x6 j | t|j! dfD ]\}}}d||| |f S W t j| tjd}|rdt|d   S d j	d!d t"D }|d" d# }t#d$| i}x8 j$|d%|d&D ]$\}}t| ts8t| |d'S q8W y" j| \}
}}dj	|
|g}W n2 t%k
r   t| t&r| j' S d(|  d) S X tt*|  d+j}|r|S |S dS ),z
    Core serialization
    Nc                s   g | ]}t | qS r;   )r1   ).0child)storer;   r<   
<listcomp>  s    z$manchesterSyntax.<locals>.<listcomp>c                s   g | ]}t | qS r;   )r1   )rY   rZ   )r[   r;   r<   r\     s   c                s    j | \}}}dj||gS )NrN   )rO   rP   )r>   rS   rR   rT   )r[   r;   r<   castToQName  s    z%manchesterSyntax.<locals>.castToQName   z( z AND z )r   z THAT c                s   g | ]}t t| qS r;   )strr1   )rY   r>   )r[   r;   r<   r\   %  s    c             S   s   g | ]}t |qS r;   )r_   )rY   cr;   r;   r<   r\   *  s    z OR c             S   s   g | ]}t |qS r;   )r_   )rY   r`   r;   r;   r<   r\   ,  s    z{  c             S   s   g | ]}t |qS r;   )r_   )rY   r`   r;   r;   r<   r\   .  s    z })subject	predicaterN   z'%s'z( %s ONLY %s )z( %s VALUE %s )z( %s SOME %s )MAXZMINZEQUALSz( %s %s %s )z
( NOT %s )
c             S   s   g | ]}d |t | f qS )zPREFIX %s: <%s>)r   )rY   kr;   r;   r<   r\   R  s    z6
SELECT ?p ?bool WHERE {?class a owl:Class; ?p ?bool .z?bool rdf:first ?foo }z?classZsparql)	processorZinitBindings)boolean<>z[])rQ   )+rW   iterr   r   intersectionOfrU   r   appendlenrP   mapr1   r_   unionOfoneOfcomplementOfr6   objectsr	   typerL   
onPropertyrO   r   r
   labelallValuesFromhasValuesomeValuesFrommaxCardinalityminCardinalitycardinalitytriples_choiceskeysr   r   query	Exceptionr   n3loggerdebugr%   )rX   r[   rh   ZtransientListZliveChildrenchildrenZ	childListnamedrZ   r]   rS   proprR   rT   Z
propStringrv   Z	onlyClassvalZ	someClassZ
cardLookupspoZcomplZprologZqstrZinitbZboolPropcolqnamer;   )r[   r<   r1     s    



  c             c   s4   x.| j tjtjdD ]}t|trt|V  qW d S )N)rc   object)subjectsr	   rt   r   r%   rU   r   )rQ   r`   r;   r;   r<   r.   m  s    
c                s    fdd}|S )Nc                s
    | _ | S )N)property)func)r   r;   r<   someFunct  s    z'termDeletionDecorator.<locals>.someFuncr;   )r   r   r;   )r   r<   r7   s  s    c               @   s   e Zd Zdd Zdd ZdS )TermDeletionHelperc             C   s
   || _ d S )N)r   )r:   r   r;   r;   r<   r=   {  s    zTermDeletionHelper.__init__c                s    fdd}|S )Nc                s   | j j| j jd f d S )N)rQ   removerV   r   )inst)r:   r;   r<   _remover  s    z-TermDeletionHelper.__call__.<locals>._removerr;   )r:   fr   r;   )r:   r<   rE   ~  s    zTermDeletionHelper.__call__N)rF   rG   rH   r=   rE   r;   r;   r;   r<   r   z  s   r   c               @   s   e Zd ZdZe Zdd ZdddZdd Zd	d
 Z	dd Z
dd Zdd Zdd Zeejdd ZeeeeZdd Zdd ZeeeZdd Zdd Zeejdd ZeeeeZdS ) r/   z
    A typed individual
    c             C   s,   x&| j j| jd d fD ]}|j| qW d S )N)factoryGraphtriplesrV   add)r:   rQ   factr;   r;   r<   	serialize  s    zIndividual.serializeNc          	   C   sx   |d k	r|pt  | _|d kr&| j| _n|| _d | _t| jt sty(| jj| j\}}}dj||g| _W n   Y nX d S )NrN   )	r   _Individual__identifierr   rQ   r   rU   rV   rO   rP   )r:   rV   rQ   rS   rR   rT   r;   r;   r<   r=     s    
zIndividual.__init__c             C   s   | j jd d | jf d S )N)rQ   r   rV   )r:   r;   r;   r<   clearInDegree  s    zIndividual.clearInDegreec             C   s   | j j| jd d f d S )N)rQ   r   rV   )r:   r;   r;   r<   clearOutDegree  s    zIndividual.clearOutDegreec             C   s   | j   | j  d S )N)r   r   )r:   r;   r;   r<   delete  s    zIndividual.deletec             C   sF   x8| j jd d | jfD ] \}}}| j j||t|f qW | j  d S )N)rQ   r   rV   r   r'   r   )r:   r?   r   r   r   r;   r;   r<   replace  s     zIndividual.replacec             c   s(   x"| j j| jtjdD ]
}|V  qW d S )N)rb   rc   )rQ   rs   rV   r	   rt   )r:   _tr;   r;   r<   	_get_type  s    zIndividual._get_typec             C   sp   |sd S t |ttfr2| jj| jtjt|f n:x8|D ]0}t |ttfsNt	| jj| jtjt|f q8W d S )N)
rU   r/   r   rQ   r   rV   r	   rt   r'   rW   )r:   kindr`   r;   r;   r<   	_set_type  s    
zIndividual._set_typec             C   s   dS )z
        >>> g = Graph()
        >>> b=Individual(OWL_NS.Restriction,g)
        >>> b.type = RDF.Resource
        >>> len(list(b.type))
        1
        >>> del b.type
        >>> len(list(b.type))
        0
        Nr;   )r:   r;   r;   r<   _delete_type  s    zIndividual._delete_typec             C   s   | j S )N)r   )r:   r;   r;   r<   _get_identifier  s    zIndividual._get_identifierc       
   	      s   st  jkrdd jjjd d fD }dd jjd d jfD }x$|D ]\}}jjj||f qTW x$|D ]\}}jj||jf qzW  _jj fdd|D  jj fdd|D  t tsy&jj \}}}	dj	||	g_
W n   Y nX d S )Nc             S   s   g | ]\}}}||fqS r;   r;   )rY   r   r   r   r;   r;   r<   r\     s    z.Individual._set_identifier.<locals>.<listcomp>c             S   s   g | ]\}}}||fqS r;   r;   )rY   r   r   r   r;   r;   r<   r\     s    c                s   g | ]\}} ||j fqS r;   )rQ   )rY   p1o1)ir:   r;   r<   r\     s    c                s   g | ]\}}|| j fqS r;   )rQ   )rY   s1r   )r   r:   r;   r<   r\     s    rN   )rW   r   rQ   r   r   ZaddNrU   r   rO   rP   r   )
r:   r   ZoldStmtsOutZ
oldStmtsInr   r   r   rS   rR   rT   r;   )r   r:   r<   _set_identifier  s(    
zIndividual._set_identifierc             c   s(   x"| j j| jtjdD ]
}|V  qW d S )N)rb   rc   )rQ   rs   rV   r   sameAs)r:   r   r;   r;   r<   _get_sameAs  s    zIndividual._get_sameAsc             C   sh   t |ttfr*| jj| jtjt|f n:x8|D ]0}t |ttfsFt	| jj| jtjt|f q0W d S )N)
rU   r/   r   rQ   r   rV   r   r   r'   rW   )r:   termr`   r;   r;   r<   _set_sameAs  s    
zIndividual._set_sameAsc             C   s   d S )Nr;   )r:   r;   r;   r<   _delete_sameAs  s    zIndividual._delete_sameAs)NN)rF   rG   rH   __doc__r   r   r   r=   r   r   r   r   r   r   r   r	   rt   r   r   r   r   rV   r   r   r   r   r   r;   r;   r;   r<   r/     s&   

z'http://attempto.ifi.uzh.ch/ace_lexicon#c                   s   e Zd ZdZd fdd	Zdd Zdd	 Zd
d Zdd Ze	e
jdd ZeeeeZdd Zdd Ze	e
jdd ZeeeeZdd Zdd Ze	e
jdd ZeeeeZ  ZS )r!   zC
    Terms in an OWL ontology with rdfs:label and rdfs:comment
    NFc                sD   t t| j|| |r@| j  | j| j|fg| j_|r@|g| _d S )N)	superr!   r=   setupACEAnnotationsrV   handleAnnotation	PN_sgPropextentrv   )r:   rV   rQ   nameAnnotationnameIsLabel)	__class__r;   r<   r=     s    zAnnotatableTerms.__init__c             C   s   t |tr|S t|S )N)rU   r   )r:   r   r;   r;   r<   r     s    z!AnnotatableTerms.handleAnnotationc             C   s   | j jdtdd ttjtj| j d| _ttjtj| j d| _	ttj
tj| j d| _ttjtj| j d| _ttjtj| j d| _ttjtj| j d| _d S )NZaceF)override)baseTyperQ   )rQ   bindr   r4   ZPN_sgr   AnnotationPropertyr   ZCN_sg	CN_sgPropZCN_pl	CN_plPropZTV_sg	TV_sgPropZTV_pl	TV_plPropTV_vbg
TV_vbgProp)r:   r;   r;   r<   r     s&    z$AnnotatableTerms.setupACEAnnotationsc             c   s(   x"| j j| jtjdD ]
}|V  qW d S )N)rb   rc   )rQ   rs   rV   r
   comment)r:   r   r;   r;   r<   _get_comment9  s    zAnnotatableTerms._get_commentc             C   sR   |sd S t |tr*| jj| jtj|f n$x"|D ]}| jj| jtj|f q0W d S )N)rU   r   rQ   r   rV   r
   r   )r:   r   r`   r;   r;   r<   _set_comment>  s    

zAnnotatableTerms._set_commentc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_commentG  s    zAnnotatableTerms._del_commentc             c   s(   x"| j j| jtjdD ]
}|V  qW d S )N)rb   rc   )rQ   rs   rV   r
   seeAlso)r:   ZsAr;   r;   r<   _get_seeAlsoM  s    zAnnotatableTerms._get_seeAlsoc             C   s0   |sd S x"|D ]}| j j| jtj|f qW d S )N)rQ   r   rV   r
   r   )r:   ZseeAlsosr   r;   r;   r<   _set_seeAlsoR  s    
zAnnotatableTerms._set_seeAlsoc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_seeAlsoX  s    zAnnotatableTerms._del_seeAlsoc             c   s(   x"| j j| jtjdD ]
}|V  qW d S )N)rb   rc   )rQ   rs   rV   r
   rv   )r:   rv   r;   r;   r<   
_get_label]  s    zAnnotatableTerms._get_labelc             C   sR   |sd S t |tr*| jj| jtj|f n$x"|D ]}| jj| jtj|f q0W d S )N)rU   r   rQ   r   rV   r
   rv   )r:   rv   lr;   r;   r<   
_set_labelb  s    

zAnnotatableTerms._set_labelc             C   s   dS )z
        >>> g=Graph()
        >>> b=Individual(OWL_NS.Restriction,g)
        >>> b.label = Literal('boo')
        >>> len(list(b.label))
        1
        >>> del b.label
        >>> len(list(b.label))
        0
        Nr;   )r:   r;   r;   r<   _delete_labelk  s    zAnnotatableTerms._delete_label)NNF)rF   rG   rH   r   r=   r   r   r   r   r   r
   r   r   r   r   r   r   r   r   r   rv   r   __classcell__r;   r;   )r   r<   r!     s$     	!		c                   sZ   e Zd ZdZd fdd	Zdd Zdd Zd	d
 Zee	d dd Z
eeee
Z  ZS )r2   z The owl ontology metadataNc                s`   t t| j|| |r|pg | _|r(|p*g | _| jtjtjf| j	kr\| j	j
| jtjtjf d S )N)r   r2   r=   importsr   rV   r	   rt   r   rQ   r   )r:   rV   r   r   rQ   )r   r;   r<   r=     s
    zOntology.__init__c             C   s   | j j| jtj|f d S )N)rQ   setrV   r   versionInfo)r:   versionr;   r;   r<   
setVersion  s    zOntology.setVersionc             c   s*   x$| j j| jtd dD ]
}|V  qW d S )Nr   )rb   rc   )rQ   rs   rV   r   )r:   rK   r;   r;   r<   _get_imports  s    zOntology._get_importsc             C   s2   |sd S x$|D ]}| j j| jtd |f qW d S )Nr   )rQ   r   rV   r   )r:   r?   r   r;   r;   r<   _set_imports  s    
zOntology._set_importsr   c             C   s   d S )Nr;   )r:   r;   r;   r<   _del_imports  s    zOntology._del_imports)NNNN)rF   rG   rH   r   r=   r   r   r   r   r   r   r   r   r   r;   r;   )r   r<   r2   |  s   c             c   sB   t  }x6| jtjtjdD ] }||kr|j| t|V  qW d S )N)rc   r   )r   r   r	   rt   r   r%   r   )rQ   ZprevClassesr`   r;   r;   r<   r     s
    
c          
   c   s   t  }x| jd tjtjtjtjtjtj	tj
tjgfD ]R\}}}|tjtjtjtj
gkr`tj
}ntj	}||kr6|j| t|| |dV  q6W d S )N)rQ   r   )r   r}   r	   rt   r   SymmetricPropertyFunctionalPropertyInverseFunctionalPropertyTransitivePropertyZDatatypePropertyObjectPropertyr   r   r4   )rQ   Z	prevPropsr   r   r   ZbTyper;   r;   r<   r      s(    


c               @   s&   e Zd Zdd ZdddZdd ZdS )	r&   c             C   s   t t| | S )N)r%   r   )r:   namer;   r;   r<   r     s    zClassNamespaceFactory.termNc             C   s
   | j |S )N)r   )r:   keydefaultr;   r;   r<   __getitem__  s    z!ClassNamespaceFactory.__getitem__c             C   s   |j drtn
| j|S d S )N__)
startswithAttributeErrorr   )r:   r   r;   r;   r<   __getattr__  s    
z!ClassNamespaceFactory.__getattr__)N)rF   rG   rH   r   r   r   r;   r;   r;   r<   r&     s   
c             c   s  t j| jkryrt| tj} x`| jj| jt jt j	gdfD ]@\}}}t
|dd}t|trrxt|D ]
}|V  qbW q8|V  q8W W n   Y nX nt| tj} t| trx| D ]<}t
|dd}t|jtrxt|D ]
}|V  qW q|V  qW nx>| jD ]4}t|jtr"x t|D ]}|V  qW q|V  qW x\| jjt| tdfD ]B\}}}t|tr~x(tt|tjD ]}|V  qlW n|V  qDW dS )z
    Takes a Class instance and returns a generator over the classes that
    are involved in its definition, ignoring unnamed classes
    NT)skipOWLClassMembership)r   r6   rt   r$   r/   r   r}   rV   rw   ry   r%   rU   r   r*   r"   
subClassOfr'   r   )clsr   r   Z
innerClsIdZinnerClsZ_c_clsr   r;   r;   r<   r*     sJ    



c             C   s   dd }t | tj} x| jD ]}|| qW | jj| jtjdf x| jD ]}|| qJW | jj| jt	jdf | j
}|r| jj| jt	j
df || t| trx| D ]}|| qW | j  | jj| j| jdf dS )aw  
    Recursively clear the given class, continuing
    where any related class is an anonymous class

    >>> EX = Namespace('http://example.com/')
    >>> namespace_manager = NamespaceManager(Graph())
    >>> namespace_manager.bind('ex', EX, override=False)
    >>> namespace_manager.bind('owl', OWL_NS, override=False)
    >>> g = Graph()
    >>> g.namespace_manager = namespace_manager
    >>> Individual.factoryGraph = g
    >>> classB = Class(EX.B)
    >>> classC = Class(EX.C)
    >>> classD = Class(EX.D)
    >>> classE = Class(EX.E)
    >>> classF = Class(EX.F)
    >>> anonClass = EX.someProp | some | classD #doctest: +SKIP
    >>> classF += anonClass #doctest: +SKIP
    >>> list(anonClass.subClassOf) #doctest: +SKIP
    [Class: ex:F ]
    >>> classA = classE | classF | anonClass #doctest: +SKIP
    >>> classB += classA #doctest: +SKIP
    >>> classA.equivalentClass = [Class()] #doctest: +SKIP
    >>> classB.subClassOf = [EX.someProp | some | classC] #doctest: +SKIP
    >>> classA #doctest: +SKIP
    ( ex:E OR ex:F OR ( ex:someProp SOME ex:D ) )
    >>> DeepClassClear(classA) #doctest: +SKIP
    >>> classA #doctest: +SKIP
    (  )
    >>> list(anonClass.subClassOf) #doctest: +SKIP
    []
    >>> classB #doctest: +SKIP
    Class: ex:B SubClassOf: ( ex:someProp SOME ex:C )

    >>> otherClass = classD | anonClass #doctest: +SKIP
    >>> otherClass #doctest: +SKIP
    ( ex:D OR ( ex:someProp SOME ex:D ) )
    >>> DeepClassClear(otherClass) #doctest: +SKIP
    >>> otherClass #doctest: +SKIP
    (  )
    >>> otherClass.delete() #doctest: +SKIP
    >>> list(g.triples((otherClass.identifier, None, None))) #doctest: +SKIP
    []
    c             S   s   t t| trt|  d S )N)rU   r'   r   r+   )_classr;   r;   r<   deepClearIfBNode:  s    z(DeepClassClear.<locals>.deepClearIfBNodeN)r$   r/   r   r   rQ   r   rV   r
   equivalentClassr   rr   rU   r"   clear	_operator)ZclassToPruner   r`   ZinverseClassr;   r;   r<   r+     s*    -


c               @   s   e Zd Zdd Zdd ZdS )r0   c             C   s
   || _ d S )N)msg)r:   r   r;   r;   r<   r=   T  s    zMalformedClass.__init__c             C   s   | j S )N)r   )r:   r;   r;   r<   __repr__W  s    zMalformedClass.__repr__N)rF   rG   rH   r=   r   r;   r;   r;   r<   r0   S  s   c             C   sR  |d kr| j p|}x8|jt| tjdD ]}|tjkrt| |d}xb|jt| d d fD ]J\}}}|tjkr^|tjkr||d< q^|tj	krq^||t
|jtd < q^W tdd tj	D j|stdtf |S x^|jt| tjtjtjgd fD ]:\}}}|tjkr tt| |dS tt| ||d	S  qW tt| |d
dS q*W d S )N)rb   rc   )rV   rQ   ru   r^   c             S   s   g | ]}t |jtd qS )r^   )r_   splitr   )rY   r   r;   r;   r<   r\   l  s   zCastClass.<locals>.<listcomp>zMalformed owl:Restriction)rQ   )operatorrQ   T)rQ   r   r   )r   rs   r'   r	   rt   r   r6   r   ru   restrictionKindsr_   r   r   intersectionr0   r}   rl   rp   rq   r,   r"   r%   )r`   rQ   r   ZkwArgsr   r   r   r;   r;   r<   r$   [  s>    





c                   s  e Zd ZdZdd Zdd Zdd ZdI fd
d	ZdJddZdd Z	e
ejdd Zeee	eZejfddZeedd Zdd Zdd ZeeeZdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Ze
ej d,d- Z!eeee!Z d.d/ Z"d0d1 Z#e
e$j%d2d3 Z&ee"e#e&Z%d4d5 Z'd6d7 Z(e
e$j)d8d9 Z*ee'e(e*Z)d:d; Z+d<d= Z,e
e$j-d>d? Z.ee+e,e.Z-d@dA Z/ee/Z0dBdC Z1dDdE Z2dKdGdHZ3  Z4S )Lr%   u  
    'General form' for classes:

    The Manchester Syntax (supported in Protege) is used as the basis for the
    form of this class

    See: http://owl-workshop.man.ac.uk/acceptedLong/submission_9.pdf:

    [Annotation]
    ‘Class:’ classID {Annotation
                        ( (‘SubClassOf:’ ClassExpression)
                        | (‘EquivalentTo’ ClassExpression)
                        | (’DisjointWith’ ClassExpression)) }

    Appropriate excerpts from OWL Reference:

    ".. Subclass axioms provide us with partial definitions: they represent
     necessary but not sufficient conditions for establishing class
     membership of an individual."

    ".. A class axiom may contain (multiple) owl:equivalentClass statements"

    "..A class axiom may also contain (multiple) owl:disjointWith statements.."

    "..An owl:complementOf property links a class to precisely one class
      description."

    c             C   s   x | j D ]}t|| jj| qW x | jD ]}t|| jj| q*W x | jD ]}t|| jj| qLW | jrt| j| jj| d S )N)r   r$   rQ   r   r   disjointWithrr   )r:   rQ   clr;   r;   r<   
_serialize  s    zClass._serializec             C   s6   x&| j j| jd d fD ]}|j| qW | j| d S )N)rQ   r   rV   r   r   )r:   rQ   r   r;   r;   r<   r     s    zClass.serializec             C   sT   t |tr|\}}n|}|}|r6| j| j|fg| j_|rP| j| j|fg| j_d S )N)rU   tuplerV   r   r   r   r   )r:   nounAnnotationsr   r   r;   r;   r<   setupNounAnnotations  s    

zClass.setupNounAnnotationsNFc                s   t t| j|||
| |	r$| j|	 | rn| jtjtjf| jkrn| jtjtj	f| jkrn| jj
| jtjtjf |rv|pxg | _|r|pg | _|r|pg | _|r|| _|r|pg | _d S )N)r   r%   r=   r   rV   r	   rt   r   rQ   r6   r   r   r   r   rr   r   )r:   rV   r   r   r   rr   rQ   r   r   r   r   r   )r   r;   r<   r=     s     
zClass.__init__c             c   s4   x.|d kr| j p|jtj| jdD ]
}|V  q"W d S )N)rc   r   )rQ   r   r	   rt   rV   )r:   rQ   memberr;   r;   r<   _get_extent  s    zClass._get_extentc             C   s4   |sd S x&|D ]}| j jt|tj| jf qW d S )N)rQ   r   r'   r	   rt   rV   )r:   r?   mr;   r;   r<   _set_extent  s    
zClass._set_extentc             C   s   d S )Nr;   )r:   r;   r;   r<   	_del_type  s    zClass._del_typec             c   s$   x| j j| |dD ]
}|V  qW d S )N)rb   rc   )rQ   rs   )r:   r   
annotationr;   r;   r<   _get_annotation  s    zClass._get_annotationc             C   s   | S )Nr;   )r>   r;   r;   r<   r@     s    zClass.<lambda>c             C   s   t dtj| jfS )NZCLASS)r   r	   rt   rV   )r:   r;   r;   r<   _get_extentQuery  s    zClass._get_extentQueryc             C   s   d S )Nr;   )r:   r?   r;   r;   r<   _set_extentQuery  s    zClass._set_extentQueryc             C   s
   t | jS )z
        >>> b=Class(OWL_NS.Restriction)
        >>> c=Class(OWL_NS.Restriction)
        >>> len(set([b,c]))
        1
        )hashrV   )r:   r;   r;   r<   __hash__  s    zClass.__hash__c             C   s"   t |tstt|| j|jkS )N)rU   r%   rW   reprrV   )r:   r?   r;   r;   r<   __eq__  s    zClass.__eq__c             C   s   t |tst| g|_| S )N)rU   r%   rW   r   )r:   r?   r;   r;   r<   __iadd__  s    zClass.__iadd__c             C   s,   t |tst| jjt|tj| jf | S )N)	rU   r%   rW   rQ   r   r'   r
   r   rV   )r:   r?   r;   r;   r<   __isub__  s    zClass.__isub__c             C   s
   t | dS )z@
        Shorthand for Manchester syntax's not operator
        )rr   )r%   )r:   r;   r;   r<   
__invert__  s    zClass.__invert__c             C   s   t tj| |g| jdS )z
        Construct an anonymous class description consisting of the union of
        this class and 'other' and return it
        )r   membersrQ   )r"   r   rp   rQ   )r:   r?   r;   r;   r<   rB     s    zClass.__or__c             C   s   t tj| |g| jdS )a  
        Construct an anonymous class description consisting of the
        intersection of this class and 'other' and return it

        >>> exNs = Namespace('http://example.com/')
        >>> namespace_manager = NamespaceManager(Graph())
        >>> namespace_manager.bind('ex', exNs, override=False)
        >>> namespace_manager.bind('owl', OWL_NS, override=False)
        >>> g = Graph()
        >>> g.namespace_manager = namespace_manager

        Chaining 3 intersections

        >>> female = Class(exNs.Female, graph=g)
        >>> human = Class(exNs.Human, graph=g)
        >>> youngPerson = Class(exNs.YoungPerson, graph=g)
        >>> youngWoman = female & human & youngPerson
        >>> youngWoman #doctest: +SKIP
        ex:YoungPerson THAT ( ex:Female AND ex:Human )
        >>> isinstance(youngWoman, BooleanClass)
        True
        >>> isinstance(youngWoman.identifier, BNode)
        True
        )r   r  rQ   )r"   r   rl   rQ   )r:   r?   r;   r;   r<   __and__  s    zClass.__and__c             c   s4   x.| j j| jtjdD ]}t|| j ddV  qW d S )N)rb   rc   T)rQ   r   )rQ   rs   rV   r
   r   r%   )r:   ancr;   r;   r<   _get_subClassOf8  s
    zClass._get_subClassOfc             C   s4   |sd S x&|D ]}| j j| jtjt|f qW d S )N)rQ   r   rV   r
   r   r'   )r:   r?   scr;   r;   r<   _set_subClassOf?  s
    
zClass._set_subClassOfc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_subClassOfF  s    zClass._del_subClassOfc             c   s2   x,| j j| jtjdD ]}t|| j dV  qW d S )N)rb   rc   )rQ   )rQ   rs   rV   r   r   r%   )r:   ecr;   r;   r<   _get_equivalentClassL  s    zClass._get_equivalentClassc             C   s4   |sd S x&|D ]}| j j| jtjt|f qW d S )N)rQ   r   rV   r   r   r'   )r:   r?   r  r;   r;   r<   _set_equivalentClassQ  s
    

zClass._set_equivalentClassc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_equivalentClassX  s    zClass._del_equivalentClassc             c   s2   x,| j j| jtjdD ]}t|| j dV  qW d S )N)rb   rc   )rQ   )rQ   rs   rV   r   r   r%   )r:   rM   r;   r;   r<   _get_disjointWith_  s    zClass._get_disjointWithc             C   s4   |sd S x&|D ]}| j j| jtjt|f qW d S )N)rQ   r   rV   r   r   r'   )r:   r?   r`   r;   r;   r<   _set_disjointWithd  s
    
zClass._set_disjointWithc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_disjointWithk  s    zClass._del_disjointWithc             C   sN   t | jj| jtjd}|s d S t|dkr>t|d | jdS tt|d S )N)rb   rc   r^   r   )rQ   )	rL   rQ   rs   rV   r   rr   rn   r%   r   )r:   compr;   r;   r<   _get_complementOfr  s    zClass._get_complementOfc             C   s&   |sd S | j j| jtjt|f d S )N)rQ   r   rV   r   rr   r'   )r:   r?   r;   r;   r<   _set_complementOf|  s    zClass._set_complementOfc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_complementOf  s    zClass._del_complementOfc             c   s   xt j| j| jD ]
}|V  qW t| jjtj| j}|rt	| jj
tj|}|r\|d }n|}x0| jjtj|D ]}t|trrt|ddV  qrW xL| jj| jtjD ]6}x0t|g| jdD ]}t|trt|ddV  qW qW dS )az  
        computed attributes that returns a generator over taxonomic 'parents'
        by disjunction, conjunction, and subsumption

        >>> from rdflib.util import first
        >>> exNs = Namespace('http://example.com/')
        >>> namespace_manager = NamespaceManager(Graph())
        >>> namespace_manager.bind('ex', exNs, override=False)
        >>> namespace_manager.bind('owl', OWL_NS, override=False)
        >>> g = Graph()
        >>> g.namespace_manager = namespace_manager
        >>> Individual.factoryGraph = g
        >>> brother = Class(exNs.Brother)
        >>> sister = Class(exNs.Sister)
        >>> sibling = brother | sister
        >>> sibling.identifier = exNs.Sibling
        >>> sibling #doctest: +SKIP
        ( ex:Brother OR ex:Sister )
        >>> first(brother.parents) #doctest: +SKIP
        Class: ex:Sibling EquivalentTo: ( ex:Brother OR ex:Sister )
        >>> parent = Class(exNs.Parent)
        >>> male = Class(exNs.Male)
        >>> father = parent & male
        >>> father.identifier = exNs.Father
        >>> list(father.parents) #doctest: +SKIP
        [Class: ex:Parent , Class: ex:Male ]

        r^   T)r   )rQ   Nr   )	itertoolschainr   r   r   r   r   r	   rV   rL   Ztransitive_subjectsrestr   rp   rU   r   r%   rs   rl   r3   )r:   parentlinkZlistSiblingsZcollectionHeadZdisjClsrdfListr   r;   r;   r<   _get_parents  s&    




zClass._get_parentsc             C   s   | j tjtjf| jkrdS t| j}x@| jj| j tj	tj
gd fD ] \}}}|jt|| j|d qBW x|D ]}dS W | jrdS dS )NF)rh   T)rV   r	   rt   r   r6   rQ   rL   r   r}   rl   rp   rm   r1   rr   )r:   r  	boolClassr   r#  er;   r;   r<   isPrimitive  s    

zClass.isPrimitivec             c   s(   x"| j jtj| jdD ]
}|V  qW d S )N)rc   r   )rQ   r   r
   r   rV   )r:   r   r;   r;   r<   subSumpteeIds  s    zClass.subSumpteeIdsTc                sN  g }t  j}t  j}x@ jj jtjtjgdfD ] \}}}|j	t
| j|d q6W t  j}	 j}
|
rx|	j	|
 d}t  jj jtj}|rd|d  d pd}|r|rd}nd} fd	d
|D }|rd| }|j	d|jdd
 |D   |rd|d  |d< |r` fdd
|D }|r6d| }|j	ddj|  |r`d|d  |d< |	r|j	ddj fdd
|	D   |rd|d  |d < t  jj jtj}|r|r|rd| |rd|d  pd dj| pdj|}n.|r|rd|d  p*dp*ddj| }t jtr@dpHd j | S )!zI
        Returns the Manchester Syntax equivalent for this class
        N)rh    (r   )z
                z, c                sB   g | ]:}t |tr.t  jtr.tt| jp<tt| jqS r;   )	rU   r%   rV   r   r  r$   rQ   r1   r'   )rY   r   )r:   r;   r<   r\     s   z"Class.__repr__.<locals>.<listcomp>zPrimitive Type %szSubClassOf: %sc             S   s   g | ]}t |qS r;   )r_   )rY   nr;   r;   r<   r\     s    z
    r^   c                s*   g | ]"}t |tr|p$tt| jqS r;   )rU   r_   r1   r'   rQ   )rY   r   )r:   r;   r<   r\     s   zA Defined Class %szEquivalentTo: %szDisjointWith %s
z
                 c                s   g | ]}t t| jqS r;   )r1   r'   rQ   )rY   r   )r:   r;   r<   r\   
  s   z
    ## %s ##z
    %sz . zSome Class z
Class: %s r   r   r   r   r   r   )rL   r   r   rQ   r}   rV   r   rl   rp   rm   r1   r   rr   rs   r
   rv   rP   r   rU   r   r   )r:   fullZnormalizationexprsr  r  r%  r   r#  rM   r`   Z	klassKindrv   ZscJoinZnecStatementsZnec_SuffStatementsdescrZ
klassDescrr;   )r:   r<   r     sh    








 zClass.__repr__)NNNNNNFNNNF)N)FT)5rF   rG   rH   r   r   r   r   r=   r   r   r   r	   rt   r   r   r   r
   rv   r  r  r  r  ZextentQueryr  r  r	  r
  r  rB   r  r  r  r   r  r  r  r   r   r  r  r  r   r  r  r  rr   r  r$  parentsr'  r(  r   r   r;   r;   )r   r<   r%     sd   
     

	



3
c               @   sn   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )r3   Nc             C   s   |r
|| _ |r|pg }|rVt| j |d | _x^|D ]}|| jkr2| jjt| q2W n6t| j t dd |D | _| j j| j| j| jj	f d S )Nr   c             S   s   g | ]}t |qS r;   )r'   )rY   r   r;   r;   r<   r\   '  s    z,OWLRDFListProxy.__init__.<locals>.<listcomp>)
rQ   r   _rdfListrm   r'   r   r   rV   r   rR   )r:   r#  r  rQ   r   r;   r;   r<   r=     s    


zOWLRDFListProxy.__init__c             C   s~   t |ts"tt|tt| t |trnt| }|t|krDdS x4t|D ]}| | || krfdS dS W n| j|jkS dS )zo
        Equivalence of boolean class constructors is determined by
        equivalence of its members
        FTN)	rU   r%   rW   r  rt   r"   rn   rangerV   )r:   r?   lengthidxr;   r;   r<   r  +  s    "
zOWLRDFListProxy.__eq__c             C   s
   t | jS )N)rn   r1  )r:   r;   r;   r<   __len__>  s    zOWLRDFListProxy.__len__c             C   s   | j jt|S )N)r1  indexr'   )r:   itemr;   r;   r<   r6  A  s    zOWLRDFListProxy.indexc             C   s
   | j | S )N)r1  )r:   r   r;   r;   r<   r   D  s    zOWLRDFListProxy.__getitem__c             C   s   t || j|< d S )N)r'   r1  )r:   r   r   r;   r;   r<   __setitem__G  s    zOWLRDFListProxy.__setitem__c             C   s   | j |= d S )N)r1  )r:   r   r;   r;   r<   __delitem__J  s    zOWLRDFListProxy.__delitem__c             C   s   | j j  d S )N)r1  r   )r:   r;   r;   r<   r   M  s    zOWLRDFListProxy.clearc             c   s   x| j D ]
}|V  qW d S )N)r1  )r:   r7  r;   r;   r<   __iter__P  s    zOWLRDFListProxy.__iter__c             C   s$   x| j D ]}|t|krdS qW dS )Nr^   r   )r1  r'   )r:   r7  r   r;   r;   r<   __contains__T  s    zOWLRDFListProxy.__contains__c             C   s   | j j| d S )N)r1  rm   )r:   r7  r;   r;   r<   rm   Z  s    zOWLRDFListProxy.appendc             C   s   | j jt| | S )N)r1  rm   r'   )r:   r?   r;   r;   r<   r	  ]  s    zOWLRDFListProxy.__iadd__)NN)rF   rG   rH   r=   r  r5  r6  r   r8  r9  r   r:  r;  rm   r	  r;   r;   r;   r<   r3     s   
c               @   s8   e Zd ZdZejZdd ZdddZdd Z	d	d
 Z
dS )r,   a8  
    Class for owl:oneOf forms:

    OWL Abstract Syntax is used

    axiom ::= 'EnumeratedClass('
        classID ['Deprecated'] { annotation } { individualID } ')'


    >>> exNs = Namespace('http://example.com/')
    >>> namespace_manager = NamespaceManager(Graph())
    >>> namespace_manager.bind('ex', exNs, override=False)
    >>> namespace_manager.bind('owl', OWL_NS, override=False)
    >>> g = Graph()
    >>> g.namespace_manager = namespace_manager
    >>> Individual.factoryGraph = g
    >>> ogbujiBros = EnumeratedClass(exNs.ogbujicBros,
    ...                              members=[exNs.chime,
    ...                                       exNs.uche,
    ...                                       exNs.ejike])
    >>> ogbujiBros #doctest: +SKIP
    { ex:chime ex:uche ex:ejike }
    >>> col = Collection(g, first(
    ...    g.objects(predicate=OWL_NS.oneOf, subject=ogbujiBros.identifier)))
    >>> [g.qname(item) for item in col]
    [u'ex:chime', u'ex:uche', u'ex:ejike']
    >>> print(g.serialize(format='n3')) #doctest: +SKIP
    @prefix ex: <http://example.com/> .
    @prefix owl: <http://www.w3.org/2002/07/owl#> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    <BLANKLINE>
    ex:ogbujicBros a owl:Class;
        owl:oneOf ( ex:chime ex:uche ex:ejike ) .
    <BLANKLINE>
    <BLANKLINE>
    c             C   s   dS )NFr;   )r:   r;   r;   r<   r'    s    zEnumeratedClass.isPrimitiveNc             C   sF   t j| ||d |r|pg }t| jjtj| jd}tj| || d S )N)rQ   )rc   rb   )	r%   r=   rL   rQ   rs   r   rq   rV   r3   )r:   rV   r  rQ   r#  r;   r;   r<   r=     s
    zEnumeratedClass.__init__c             C   s   t | jj| j| jdS )zI
        Returns the Manchester Syntax equivalent for this class
        )rh   )r1   r1  rR   rQ   r   )r:   r;   r;   r<   r     s    zEnumeratedClass.__repr__c             C   s   t |t }x*| jD ] }|j| t|| jj| qW |j| j| j	|j
f x<| jj| jd d fD ]$\}}}|| j	krd|j|||f qdW | j| d S )N)r   r   r1  rm   r$   rQ   r   r   rV   r   rR   r   r   )r:   rQ   
clonedListr   r   r   r   r;   r;   r<   r     s    
 
zEnumeratedClass.serialize)NNN)rF   rG   rH   r   r   rq   r   r'  r=   r   r   r;   r;   r;   r<   r,   b  s   $
c               @   s    e Zd ZdZdd Zdd ZdS )BooleanClassExtentHelpera  
    >>> testGraph = Graph()
    >>> Individual.factoryGraph = testGraph
    >>> EX = Namespace("http://example.com/")
    >>> namespace_manager = NamespaceManager(Graph())
    >>> namespace_manager.bind('ex', EX, override=False)
    >>> testGraph.namespace_manager = namespace_manager
    >>> fire = Class(EX.Fire)
    >>> water = Class(EX.Water)
    >>> testClass = BooleanClass(members=[fire, water])
    >>> testClass2 = BooleanClass(
    ...     operator=OWL_NS.unionOf, members=[fire, water])
    >>> for c in BooleanClass.getIntersections():
    ...     print(c) #doctest: +SKIP
    ( ex:Fire AND ex:Water )
    >>> for c in BooleanClass.getUnions():
    ...     print(c) #doctest: +SKIP
    ( ex:Fire OR ex:Water )
    c             C   s
   || _ d S )N)r   )r:   r   r;   r;   r<   r=     s    z!BooleanClassExtentHelper.__init__c                s    fdd}|S )Nc              3   s,   x&t jj jD ]} t|  jdV  qW d S )N)r   )r/   r   r   r   r"   )r`   )r:   r;   r<   
_getExtent  s    z5BooleanClassExtentHelper.__call__.<locals>._getExtentr;   )r:   r   r>  r;   )r:   r<   rE     s    z!BooleanClassExtentHelper.__call__N)rF   rG   rH   r   r=   rE   r;   r;   r;   r<   r=    s   r=  c               @   s   e Zd Zdd ZdS )r#   c             C   s
   || _ d S )N)rE   )r:   Zanycallabler;   r;   r<   r=     s    zCallable.__init__N)rF   rG   rH   r=   r;   r;   r;   r<   r#     s   c               @   s   e Zd ZdZeejedd ZeeZeej	edd Z
ee
Z
dejddfddZd	d
 Zdd Zdd Zdd Zdd Zdd ZdS )r"   zm
    See: http://www.w3.org/TR/owl-ref/#Boolean

    owl:complementOf is an attribute of Class, however

    c               C   s   d S )Nr;   r;   r;   r;   r<   getIntersections  s    zBooleanClass.getIntersectionsc               C   s   d S )Nr;   r;   r;   r;   r<   	getUnions  s    zBooleanClass.getUnionsNc       
      C   s   |d krZg }x4|j |tjtjgd fD ]\}}}|j| |}q&W t|dksZtt|tj	| ||d |tjtjgkstt
||| _t| jj|| jd}	| s|	 stdtt| j|	d j  tj	| |	| d S )Nr^   )rQ   )rc   rb   z-This is a previous boolean class description!r   )r}   r   rl   rp   rm   rn   rW   r  r%   r=   r_   r   rL   rQ   rs   rV   r   r   r3   )
r:   rV   r   r  rQ   propsr   r   r   r#  r;   r;   r<   r=     s&    
zBooleanClass.__init__c             C   s   t | jt| | jd}|S )z-
        Create a copy of this class
        )r   r  rQ   )r"   r   rL   rQ   )r:   ZcopyOfClassr;   r;   r<   copy  s    zBooleanClass.copyc             C   s   t |t }x*| jD ] }|j| t|| jj| qW |j| j| j	|j
f x<| jj| jd d fD ]$\}}}|| j	krd|j|||f qdW | j| d S )N)r   r   r1  rm   r$   rQ   r   r   rV   r   rR   r   r   )r:   rQ   r<  r   r   r   r   r;   r;   r<   r     s    
 
zBooleanClass.serializec             C   s   dS )NFr;   )r:   r;   r;   r<   r'    s    zBooleanClass.isPrimitivec             C   s^   t rdd nd || jks"td| jj| j| j| jjf | jj| j|| jjf || _d S )Na  
        Converts a unionOf / intersectionOf class expression into one
        that instead uses the given operator


        >>> testGraph = Graph()
        >>> Individual.factoryGraph = testGraph
        >>> EX = Namespace("http://example.com/")
        >>> namespace_manager = NamespaceManager(Graph())
        >>> namespace_manager.bind('ex', EX, override=False)
        >>> testGraph.namespace_manager = namespace_manager
        >>> fire = Class(EX.Fire)
        >>> water = Class(EX.Water)
        >>> testClass = BooleanClass(members=[fire,water])
        >>> testClass #doctest: +SKIP
        ( ex:Fire AND ex:Water )
        >>> testClass.changeOperator(OWL_NS.unionOf)
        >>> testClass #doctest: +SKIP
        ( ex:Fire OR ex:Water )
        >>> try: testClass.changeOperator(OWL_NS.unionOf)
        ... except Exception%s: print(e)
        The new operator is already being used!

        zas ez, ez'The new operator is already being used!)	r   r   rW   rQ   r   rV   r1  rR   r   )r:   ZnewOperatorr;   r;   r<   changeOperator  s    zBooleanClass.changeOperatorc             C   s   t | jj| j| jdS )zI
        Returns the Manchester Syntax equivalent for this class
        )rh   )r1   r1  rR   rQ   r   )r:   r;   r;   r<   r   .  s    zBooleanClass.__repr__c             C   s$   | j tjkst| jjt| | S )z9
        Adds other to the list and returns self
        )r   r   rp   rW   r1  rm   r'   )r:   r?   r;   r;   r<   rB   5  s    zBooleanClass.__or__)rF   rG   rH   r   r=  r   rl   r#   r?  rp   r@  r=   rB  r   r'  rC  r   rB   r;   r;   r;   r<   r"     s   c             C   s   dS )zH
    DisjointClasses(' description description { description } ')'

    Nr;   )r  r;   r;   r<   r   >  s    c                   s  e Zd ZdZejejejejej	gZ
e dddddddf fdd	Zdd Zdd Zd	d
 Zdd Zdd Zdd Zeejdd ZeeeeZdd Zdd Zeejdd ZeeeeZdd Zdd Zeejdd ZeeeeZdd  Zd!d" Zeejd#d$ ZeeeeZd%d& Z d'd( Z!eej"d)d* Z#ee e!e#Z"d+d, Z$d-d. Z%eejd/d0 Z&ee$e%e&Zd1d2 Z'd3d4 Z(eej	d5d6 Z)ee'e(e)Z	d7d8 Z*d9d: Z+  Z,S );r6   ad  
    restriction ::= 'restriction('
                            datavaluedPropertyID dataRestrictionComponent
                                 { dataRestrictionComponent } ')'
                  | 'restriction(' individualvaluedPropertyID
                      individualRestrictionComponent
                      { individualRestrictionComponent } ')'
    Nc
                sz  t t| j|	|dd | jtjt|f|krD|j| jtjt|f || _|tjf|tj	f|tj
f|tjf|tjf|tjfg}
dd |
D }t|st|j \}}|| _t|tr|| _n,t|trt|| _nt| jj| j|| _| j|| jf| jkr| jj| j|| jf | jd k	s.tt| j| jtjtjf| jkrv| jj| jtjtjf | jj| jtjtjf d S )NT)rQ   r   c             S   s   g | ]\}}|r||fqS r;   r;   )rY   r   ZoTermr;   r;   r<   r\   p  s    z(Restriction.__init__.<locals>.<listcomp>)r   r6   r=   rV   r   ru   r5   r   rw   ry   rx   r|   rz   r{   rn   rW   poprestrictionTyperU   r   restrictionRanger%   r'   r   rQ   rs   r	   rt   r   )r:   ru   rQ   rw   ry   r   r|   rz   r{   rV   Z
restrTypesZvalidRestrPropsrF  rE  )r   r;   r<   r=   V  sD    



zRestriction.__init__c             C   sr   t | j| jddj| xT| jj| jddfD ]<\}}}|j|||f |tjtj	gkr.t
|| jj| q.W dS )a  
        >>> g1 = Graph()
        >>> g2 = Graph()
        >>> EX = Namespace("http://example.com/")
        >>> namespace_manager = NamespaceManager(g1)
        >>> namespace_manager.bind('ex', EX, override=False)
        >>> namespace_manager = NamespaceManager(g2)
        >>> namespace_manager.bind('ex', EX, override=False)
        >>> Individual.factoryGraph = g1
        >>> prop = Property(EX.someProp, baseType=OWL_NS.DatatypeProperty)
        >>> restr1 = (Property(
        ...    EX.someProp,
        ...    baseType=OWL_NS.DatatypeProperty)) | some | (Class(EX.Foo))
        >>> restr1 #doctest: +SKIP
        ( ex:someProp SOME ex:Foo )
        >>> restr1.serialize(g2)
        >>> Individual.factoryGraph = g2
        >>> list(Property(
        ...     EX.someProp,baseType=None).type
        ... ) #doctest: +NORMALIZE_WHITESPACE +SKIP
        [rdflib.term.URIRef(
            u'http://www.w3.org/2002/07/owl#DatatypeProperty')]
        N)rQ   r   )r4   ru   rQ   r   r   rV   r   r   rw   ry   r$   )r:   rQ   r   r   r   r;   r;   r<   r     s     zRestriction.serializec             C   s   dS )NFr;   )r:   r;   r;   r<   r'    s    zRestriction.isPrimitivec             C   s   t | j| jfS )N)r  ru   rF  )r:   r;   r;   r<   r    s    zRestriction.__hash__c             C   sL   t |ts"tt|tt| t |trD|j| jkoB|j| jkS dS dS )z
        Equivalence of restrictions is determined by equivalence of the
        property in question and the restriction 'range'
        FN)rU   r%   rW   r  rt   r6   ru   rF  )r:   r?   r;   r;   r<   r    s
    "
zRestriction.__eq__c             C   s   t | jj| jtjdd S )N)rb   rc   r   )rL   rQ   rs   rV   r   ru   )r:   r;   r;   r<   _get_onProperty  s    zRestriction._get_onPropertyc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   ru   r5   rQ   r   )r:   r   tripler;   r;   r<   _set_onProperty  s    
zRestriction._set_onPropertyc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_onProperty  s    zRestriction._del_onPropertyc             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   rw   r%   )r:   r   r;   r;   r<   _get_allValuesFrom  s    zRestriction._get_allValuesFromc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   rw   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_allValuesFrom  s    
zRestriction._set_allValuesFromc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_allValuesFrom  s    zRestriction._del_allValuesFromc             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   ry   r%   )r:   r   r;   r;   r<   _get_someValuesFrom  s    zRestriction._get_someValuesFromc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   ry   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_someValuesFrom  s    
zRestriction._set_someValuesFromc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_someValuesFrom  s    zRestriction._del_someValuesFromc             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   rx   r%   )r:   r   r;   r;   r<   _get_hasValue  s    zRestriction._get_hasValuec             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   rx   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_hasValue  s    
zRestriction._set_hasValuec             C   s   d S )Nr;   )r:   r;   r;   r<   _del_hasValue  s    zRestriction._del_hasValuec             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   r|   r%   )r:   r   r;   r;   r<   _get_cardinality  s    zRestriction._get_cardinalityc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   r|   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_cardinality  s    
zRestriction._set_cardinalityc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_cardinality  s    zRestriction._del_cardinalityc             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   rz   r%   )r:   r   r;   r;   r<   _get_maxCardinality$  s    zRestriction._get_maxCardinalityc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   rz   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_maxCardinality*  s    
zRestriction._set_maxCardinalityc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_maxCardinality4  s    zRestriction._del_maxCardinalityc             C   s.   x(| j j| jtjdD ]}t|| j dS W d S )N)rb   rc   )rQ   )rQ   rs   rV   r   r{   r%   )r:   r   r;   r;   r<   _get_minCardinality;  s    zRestriction._get_minCardinalityc             C   s8   | j tjt|f}|sd S || jkr(d S | jj| d S )N)rV   r   r{   r'   rQ   r   )r:   r?   rH  r;   r;   r<   _set_minCardinalityA  s    
zRestriction._set_minCardinalityc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_minCardinalityK  s    zRestriction._del_minCardinalityc             C   s2   x*| j j| j| jd fD ]}|jtd S W  d S )Nr^   r   )rQ   Ztriple_choicesrV   r   r   r   )r:   r   r;   r;   r<   restrictionKindR  s
    zRestriction.restrictionKindc             C   s   t | j| jS )zO
        Returns the Manchester Syntax equivalent for this restriction
        )r1   rV   rQ   )r:   r;   r;   r<   r   Y  s    zRestriction.__repr__)-rF   rG   rH   r   r   rw   ry   rx   rz   r{   r   r   r=   r   r'  r  r  rG  rI  r   ru   rJ  r   rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  r|   rV  rW  rX  rY  rZ  r[  r\  r]  r   r   r;   r;   )r   r<   r6   F  sj   &




	





c             C   s   t | |j|dS )N)rQ   ry   )r6   rQ   )r   r   r;   r;   r<   r@   b  s   r@   c             C   s   t | |j|dS )N)rQ   rw   )r6   rQ   )r   r   r;   r;   r<   r@   d  s   c             C   s   t | | j|dS )N)rQ   rz   )r6   rQ   )r   r   r;   r;   r<   r@   f  s   c             C   s   t | | j|dS )N)rQ   r{   )r6   rQ   )r   r   r;   r;   r<   r@   h  s   c             C   s   t | | j|dS )N)rQ   r|   )r6   rQ   )r   r   r;   r;   r<   r@   j  s   c             C   s   t | | j|dS )N)rQ   r   )r6   rQ   )r   r   r;   r;   r<   r@   m  s    zh
%s( %s { %s }
%s
{ 'super(' datavaluedPropertyID ')'} ['Functional']
{ domain( %s ) } { range( %s ) } )c                   s2  e Zd ZdZdd Zddejddddddddddf fdd	Zdd	 Zd*d
dZ	dd Z
ee	e
Zdd Zdd Zdd Zeejdd ZeeeeZdd Zdd Zeejdd ZeeeeZdd Zdd Zeejd d! ZeeeeZd"d# Zd$d% Zeejd&d' ZeeeeZd(d) Z   Z!S )+r4   a  
    axiom ::= 'DatatypeProperty(' datavaluedPropertyID ['Deprecated']
                { annotation }
                { 'super(' datavaluedPropertyID ')'} ['Functional']
                { 'domain(' description ')' } { 'range(' dataRange ')' } ')'
            | 'ObjectProperty(' individualvaluedPropertyID ['Deprecated']
                { annotation }
                { 'super(' individualvaluedPropertyID ')' }
                [ 'inverseOf(' individualvaluedPropertyID ')' ] [ 'Symmetric' ]
                [ 'Functional' | 'InverseFunctional' |
                  'Functional' 'InverseFunctional' |
                  'Transitive' ]
                { 'domain(' description ')' } { 'range(' description ')' } ')
    c             C   st   t |tr|\}}}n|}|}|}|r<| j| j|fg| j_|rV| j| j|fg| j_|rp| j| j|fg| j_d S )N)rU   r   rV   r   r   r   r   r   )r:   verbAnnotationsr   r   r   r;   r;   r<   setupVerbAnnotations  s    
zProperty.setupVerbAnnotationsNFc                s   t t| j|||| |r$| j| t| jt s6t|d krXtt	| j| j
dj| _n0| jtj|f| j
kr| j
j| jtj|f || _|| _|| _|| _|| _|
r|
pg | _d S )N)rQ   )r   r4   r=   r_  rU   rV   r   rW   r   r/   rQ   rt   Z	_baseTyper	   r   subPropertyOf	inverseOfdomainr2  r   )r:   rV   rQ   r   r`  rb  r2  ra  Z	otherTypeZequivalentPropertyr   r^  r   r   )r   r;   r<   r=     s     
zProperty.__init__c             C   s|   x&| j j| jd d fD ]}|j| qW x"tj| j| jD ]}|j| q:W x*tj| j	| j
D ]}t|| j j| q^W d S )N)rQ   r   rV   r   r  r  r`  ra  r   rb  r2  r$   )r:   rQ   r   r   r`   r;   r;   r<   r     s    

zProperty.serializec             c   s4   x.|d kr| j p|jd | jd fD ]
}|V  q"W d S )N)rQ   r   rV   )r:   rQ   rH  r;   r;   r<   r     s    zProperty._get_extentc             C   s2   |sd S x$|D ]\}}| j j|| j|f qW d S )N)rQ   r   rV   )r:   r?   Zsubjobjr;   r;   r<   r     s    zProperty._set_extentc                s  g }t jjkr|jdjtjr.tjp0df  tjrttjj}|rp|jjkrptjj}nt	tj}|jd|t j
jkrdpdf  xjjjtjt jt jt jgfD ]"\}}}|jt|jt d  qW n`|jdjtjrtjpdf  x2jjjtjt jfD ]\}}}|jd q2W dd	  |jd
j fddjD  |jd
j fddjD  |jd
j fddjD  djdd |D }|d7 }t|jdS )Nz!ObjectProperty( %s annotation(%s)r)  z  inverseOf( %s )%sz
 Symmetricr^   zDatatypeProperty( %s %sz   Functionalc             S   sZ   t | }t|tr| S |jtr(t| S t|j|tj	tj
gd frLt| S t| jS d S )N)r'   rU   r   r   _XSD_NSr_   r   r}   r   rp   rl   r  r   )r   gZnormalizedNamer;   r;   r<   canonicalName  s    

z(Property.__repr__.<locals>.canonicalNamera   c                s   g | ]}d  |j  qS )z   super( %s ))rQ   )rY   ZsuperP)rf  r:   r;   r<   r\     s   z%Property.__repr__.<locals>.<listcomp>c                s   g | ]}d  |j  qS )z   domain( %s ))rQ   )rY   rb  )rf  r:   r;   r<   r\     s   c                s   g | ]}d  |j  qS )z   range( %s ))rQ   )rY   r2  )rf  r:   r;   r<   r\      s   re   c             S   s   g | ]}|r|qS r;   r;   )rY   exprr;   r;   r<   r\     s    z
)zutf-8r   )r   r   rt   rm   r   r   r   ra  rV   r  r   rQ   r}   r	   r   r   r   r_   r   r   rP   r`  rb  r2  encode)r:   rtZtwoLinkInverseZinverseReprr   r   ZroleTyper;   )rf  r:   r<   r     sP    


zProperty.__repr__c             c   s4   x.| j j| jtjdD ]}t|| j d dV  qW d S )N)rb   rc   )rQ   r   )rQ   rs   rV   r
   r`  r4   )r:   r  r;   r;   r<   _get_subPropertyOf  s    zProperty._get_subPropertyOfc             C   s4   |sd S x&|D ]}| j j| jtjt|f qW d S )N)rQ   r   rV   r
   r`  r'   )r:   r?   ZsPr;   r;   r<   _set_subPropertyOf  s
    
zProperty._set_subPropertyOfc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_subPropertyOf  s    zProperty._del_subPropertyOfc             c   s4   x.| j j| jtjdD ]}t|| j d dV  qW d S )N)rb   rc   )rQ   r   )rQ   rs   rV   r   ra  r4   )r:   r  r;   r;   r<   _get_inverseOf  s    zProperty._get_inverseOfc             C   s&   |sd S | j j| jtjt|f d S )N)rQ   r   rV   r   ra  r'   )r:   r?   r;   r;   r<   _set_inverseOf  s    zProperty._set_inverseOfc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_inverseOf%  s    zProperty._del_inverseOfc             c   s2   x,| j j| jtjdD ]}t|| j dV  qW d S )N)rb   rc   )rQ   )rQ   rs   rV   r
   rb  r%   )r:   domr;   r;   r<   _get_domain+  s    zProperty._get_domainc             C   s^   |sd S t |ttfr2| jj| jtjt|f n(x&|D ]}| jj| jtjt|f q8W d S )N)	rU   r/   r   rQ   r   rV   r
   rb  r'   )r:   r?   rp  r;   r;   r<   _set_domain0  s    
zProperty._set_domainc             C   s   d S )Nr;   )r:   r;   r;   r<   _del_domain;  s    zProperty._del_domainc             c   s2   x,| j j| jtjdD ]}t|| j dV  qW d S )N)rb   rc   )rQ   )rQ   rs   rV   r
   r2  r%   )r:   Zranr;   r;   r<   
_get_rangeA  s    zProperty._get_rangec             C   s^   |sd S t |ttfr2| jj| jtjt|f n(x&|D ]}| jj| jtjt|f q8W d S )N)	rU   r/   r   rQ   r   rV   r
   r2  r'   )r:   rangesr2  r;   r;   r<   
_set_rangeF  s    
zProperty._set_rangec             C   s   d S )Nr;   )r:   r;   r;   r<   
_del_rangeQ  s    zProperty._del_rangec             C   sD   x*| j D ] \}}}| jj|t||f qW | jjd | jd f d S )N)r   rQ   r   r5   r   rV   )r:   r?   r   r   r   r;   r;   r<   r   W  s    zProperty.replace)N)"rF   rG   rH   r   r_  r   r   r=   r   r   r   r   r   r   rj  rk  r   r
   r`  rl  rm  rn  ra  ro  rq  rr  rb  rs  rt  rv  r2  rw  r   r   r;   r;   )r   r<   r4   w  s@   


<
c             C   s`   t | }|jdt |jdt |jdt x(t|j D ]\}}|j||dd q:W || _dS )zI
    Takes a graph and binds the common namespaces (rdf,rdfs, & owl)
    rJ   rI   rK   F)r   N)r   r   r
   r	   r   rL   itemsnamespace_manager)rQ   ZadditionalNSry  rS   rR   r;   r;   r<   r)   ^  s    c              C   s   dd l } | j  d S )Nr   )doctesttestmod)rz  r;   r;   r<   testk  s    r|  __main__)NF)N)\
__future__r   r   r   sixr   r   r  Zrdflibr   r   r   r	   r
   r   r   Zrdflib.graphr   Zrdflib.collectionr   Zrdflib.namespacer   rd  r   Zrdflib.termr   Zrdflib.utilr   logging	getLoggerrF   r   __all__r8   r   r   r-   r(   r'   r5   r1   r.   r7   r   r   r/   r   r!   r2   r   r    r&   r   ZresourceProperties
differenceru   rw   rx   ry   ra  r   r   ZbackwardCompatibleWithZincompatibleWithrp   rl   rq   r   r*   r+   r   r0   r$   r%   r3   r,   ZBooleanPredicatesr=  r#   r"   r   r6   r   r   r   r   r   r   r   r4   r)   r|  r;   r;   r;   r<   <module>   s   n$	
	
i
|y 
3F
&   GEp  
 h
