/// <summary>
        /// Gets an ontology data containing the facts which are members of this class
        /// </summary>
        public override RDFOntologyData EnlistMembers(RDFOntology ontology) {
            var facts             = new RDFOntologyData();
            if (ontology         != null) {

                //Iterate the classes belonging to the intersection class
                Boolean firstIter = true;
                var compClassEnum = this.CompositingClassesEnumerator();
                while (compClassEnum.MoveNext()) {

                    //The first iteration must give the facts belonging to the first class
                    if (firstIter) {
                        facts     = compClassEnum.Current.EnlistMembers(ontology);
                        firstIter = false;
                    }

                    //The other iterations must compose them with an intersection logic
                    else {
                        facts     = facts.IntersectWith(compClassEnum.Current.EnlistMembers(ontology));
                    }

                }

            }
            return facts;
        }
        /// <summary>
        /// Enlists the facts which are members of the given composition within the given ontology
        /// </summary>
        internal static RDFOntologyData EnlistMembersOfComposite(RDFOntologyClass ontCompClass, RDFOntology ontology) {
            var result            = new RDFOntologyData();

            //Intersection
            if (ontCompClass      is RDFOntologyIntersectionClass) {

                //Filter "intersectionOf" relations made with the given intersection class
                var firstIter     = true;
                var iTaxonomy     = ontology.Model.ClassModel.Relations.IntersectionOf.SelectEntriesBySubject(ontCompClass);
                foreach (var      tEntry in iTaxonomy) {
                    if  (firstIter) {
                        result    = RDFOntologyReasoningHelper.EnlistMembersOf((RDFOntologyClass)tEntry.TaxonomyObject, ontology);
                        firstIter = false;
                    }
                    else {
                        result    = result.IntersectWith(RDFOntologyReasoningHelper.EnlistMembersOf((RDFOntologyClass)tEntry.TaxonomyObject, ontology));
                    }
                }

            }

            //Union
            else if (ontCompClass is RDFOntologyUnionClass) {

                //Filter "unionOf" relations made with the given union class
                var uTaxonomy     = ontology.Model.ClassModel.Relations.UnionOf.SelectEntriesBySubject(ontCompClass);
                foreach (var      tEntry in uTaxonomy) {
                    result        = result.UnionWith(RDFOntologyReasoningHelper.EnlistMembersOf((RDFOntologyClass)tEntry.TaxonomyObject, ontology));
                }

            }

            //Complement
            else if (ontCompClass is RDFOntologyComplementClass) {
                result            = ontology.Data.DifferenceWith(RDFOntologyReasoningHelper.EnlistMembersOf(ontCompClass, ontology));
            }

            return result;
        }