def neighborhood(self, elements: List[ELEMENT_NAME]) \
            -> References:
        """ Return a list of all slots, classes and types that touch any element in elements, including the element
        itself

        @param elements: Elements to do proximity with
        @return: All slots and classes that touch element
        """
        touches = References()
        for element in elements:
            if element in self.schema.classes:
                touches.classrefs.add(element)
                if None in touches.classrefs:
                    raise ValueError("1")
                cls = self.schema.classes[element]
                if cls.is_a:
                    touches.classrefs.add(cls.is_a)
                if None in touches.classrefs:
                    raise ValueError("1")
                # Mixins include apply_to's
                touches.classrefs.update(set(cls.mixins))
                for slotname in cls.slots:
                    slot = self.schema.slots[slotname]
                    if slot.range in self.schema.classes:
                        touches.classrefs.add(slot.range)
                    elif slot.range in self.schema.types:
                        touches.typerefs.add(slot.range)
                    if None in touches.classrefs:
                        raise ValueError("1")
                if element in self.synopsis.rangerefs:
                    for slotname in self.synopsis.rangerefs[element]:
                        touches.slotrefs.add(slotname)
                        if self.schema.slots[slotname].domain:
                            touches.classrefs.add(self.schema.slots[slotname].domain)
            elif element in self.schema.slots:
                touches.slotrefs.add(element)
                slot = self.schema.slots[element]
                touches.slotrefs.update(set(slot.mixins))
                if slot.is_a:
                    touches.slotrefs.add(slot.is_a)
                if element in self.synopsis.inverses:
                    touches.slotrefs.update(self.synopsis.inverses[element])
                if slot.domain:
                    touches.classrefs.add(slot.domain)
                if slot.range in self.schema.classes:
                    touches.classrefs.add(slot.range)
                elif slot.range in self.schema.types:
                    touches.typerefs.add(slot.range)
            elif element in self.schema.types:
                if element in self.synopsis.rangerefs:
                    touches.slotrefs.update(self.synopsis.rangerefs[element])

        return touches
def neighborhood ( self , elements : List [ ELEMENT_NAME ] ) -> References : touches = References ( ) for element in elements : if element in self . schema . classes : touches . classrefs . add ( element ) if None in touches . classrefs : raise ValueError ( "1" ) cls = self . schema . classes [ element ] if cls . is_a : touches . classrefs . add ( cls . is_a ) if None in touches . classrefs : raise ValueError ( "1" ) touches . classrefs . update ( set ( cls . mixins ) ) for slotname in cls . slots : slot = self . schema . slots [ slotname ] if slot . range in self . schema . classes : touches . classrefs . add ( slot . range ) elif slot . range in self . schema . types : touches . typerefs . add ( slot . range ) if None in touches . classrefs : raise ValueError ( "1" ) if element in self . synopsis . rangerefs : for slotname in self . synopsis . rangerefs [ element ] : touches . slotrefs . add ( slotname ) if self . schema . slots [ slotname ] . domain : touches . classrefs . add ( self . schema . slots [ slotname ] . domain ) elif element in self . schema . slots : touches . slotrefs . add ( element ) slot = self . schema . slots [ element ] touches . slotrefs . update ( set ( slot . mixins ) ) if slot . is_a : touches . slotrefs . add ( slot . is_a ) if element in self . synopsis . inverses : touches . slotrefs . update ( self . synopsis . inverses [ element ] ) if slot . domain : touches . classrefs . add ( slot . domain ) if slot . range in self . schema . classes : touches . classrefs . add ( slot . range ) elif slot . range in self . schema . types : touches . typerefs . add ( slot . range ) elif element in self . schema . types : if element in self . synopsis . rangerefs : touches . slotrefs . update ( self . synopsis . rangerefs [ element ] ) return touches
Return a list of all slots, classes and types that touch any element in elements, including the element
        itself

        @param elements: Elements to do proximity with
        @return: All slots and classes that touch element