private void update() {
		if (!updated) {
			classInstancesPerPropertyMap = new HashMap<String, Map<String, Integer>>();
			classCommonPropertyMap  = new HashMap<String, Set<String>>();

			// count number of class instances per property
			for (Map.Entry<String, Set<String>> propertyEntry : propSubjectMap
					.entrySet()) {
				String propertyUri = propertyEntry.getKey();
				

				for (String subjectUri : propertyEntry.getValue()) {
					Set<String> subjectClasses = subjectClassMap.get(subjectUri);
					if (subjectClasses != null)
						for (String classUri : subjectClasses) {
							increaseClassInstancesPerProperty(classUri, propertyUri, 1);
						}
				}
			}
			
			// choose properties that all instances of a class have
			for (Map.Entry<String, Map<String, Integer>> outerEntry : classInstancesPerPropertyMap
					.entrySet()) {
				String classUri = outerEntry.getKey();
				Integer numClassInstances = classInstanceMap.get(classUri).size();
				for (Map.Entry<String, Integer> innerEntry : outerEntry.getValue() 
						.entrySet()) {
					String propertyUri = innerEntry.getKey();
					Integer numInstancesPerProperty = innerEntry.getValue();
					if(numInstancesPerProperty.equals(numClassInstances))
						addCommonProperty(classUri, propertyUri);

				}
			}
			updated = true;
		}
	}