docs: 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