def build_properties(self, hide_implicit_preds=True):
        """
        2015-06-04: removed sparql 1.1 queries
        2015-06-03: analogous to get classes

        # instantiate properties making sure duplicates are pruned
        # but the most specific rdftype is kept
        # eg OWL:ObjectProperty over RDF:property

        """
        self.all_properties = []  # @todo: keep adding?
        self.all_properties_annotation = []
        self.all_properties_object = []
        self.all_properties_datatype = []

        qres = self.sparqlHelper.getAllProperties(hide_implicit_preds)
        # print("rdflib query done")

        for candidate in qres:

            test_existing_prop = self.get_property(uri=candidate[0])
            if not test_existing_prop:
                # create it
                self.all_properties += [OntoProperty(candidate[0], candidate[1], self.namespaces)]
            else:
                # update it
                if candidate[1] and (test_existing_prop.rdftype == rdflib.RDF.Property):
                    test_existing_prop.rdftype = inferMainPropertyType(candidate[1])
        # print("properties created")

        # add more data
        for aProp in self.all_properties:
            # print("enriching prop..", aProp)
            if aProp.rdftype == rdflib.OWL.DatatypeProperty:
                self.all_properties_datatype += [aProp]
            elif aProp.rdftype == rdflib.OWL.AnnotationProperty:
                self.all_properties_annotation += [aProp]
            elif aProp.rdftype == rdflib.OWL.ObjectProperty:
                self.all_properties_object += [aProp]
            else:
                pass

            aProp.triples = self.sparqlHelper.entityTriples(aProp.uri)
            aProp._buildGraph()  # force construction of mini graph

            # attach to an ontology [2015-06-15: no property type distinction yet]
            for uri in aProp.getValuesForProperty(rdflib.RDFS.isDefinedBy):
                onto = self.get_ontology(uri=str(uri))
                if onto:
                    onto.all_properties += [aProp]
                    aProp.ontology = onto

            self.__buildDomainRanges(aProp)

            # add direct Supers
            directSupers = self.sparqlHelper.getPropDirectSupers(aProp.uri)

            for x in directSupers:
                superprop = self.get_property(uri=x[0])
                # note: extra condition to avoid recursive structures
                if superprop and superprop.uri != aProp.uri:
                    aProp._parents.append(superprop)

                    # add inverse relationships (= direct subs for superprop)
                    if aProp not in superprop.children():
                        superprop._children.append(aProp)

        # sort alphabetically
        self.all_properties = sorted(self.all_properties, key=lambda x: x.qname)

        # computer top layer for properties
        # print("calc toplayer")
        exit = []
        for c in self.all_properties:
            if not c.parents():
                exit += [c]
        self.toplayer_properties = exit
2015-06-04: removed sparql 1.1 queries
        2015-06-03: analogous to get classes

        # instantiate properties making sure duplicates are pruned
        # but the most specific rdftype is kept
        # eg OWL:ObjectProperty over RDF:property