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

                //Retrieve ontology data facts having the restricted property in their attributes
                var facts     = base.EnlistMembers(ontology);

                //Iterate the ontology data facts
                foreach(var f in facts) {

                    //Iterate the ontology attributes of the current ontology fact
                    var factOntAttributesEnum = f.OntologyAttributesEnumerator();
                    while (factOntAttributesEnum.MoveNext()) {
                        if (factOntAttributesEnum.Current.AttributeProperty.Equals(this.OnProperty)) {
                            if (factOntAttributesEnum.Current.AttributeValue.Equals(this.RequiredFact)) {
                                resultFacts.AddFact(f);
                            }
                        }
                    }

                }

            }
            return resultFacts;
        }
        /// <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) {

                //Get the facts belonging to the complemented class
                facts     = this.ComplementClass.EnlistMembers(ontology);

                //Complement the ontology data with the retrieved facts
                facts     = ontology.Data.DifferenceWith(facts);

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

                //Iterate the ontology data facts
                foreach(RDFOntologyFact f in ontology.Data) {

                    //Iterate the ontology attributes of the current ontology fact
                    var factOntAttributesEnum = f.OntologyAttributesEnumerator();
                    while (factOntAttributesEnum.MoveNext()) {
                        if (factOntAttributesEnum.Current.AttributeProperty.Equals(this.OnProperty)) {
                            facts.AddFact(f);
                        }
                    }

                }

            }
            return facts;
        }
        /// <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>
        /// Gets an ontology data representation of this scheme
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            RDFOntologyData result = new RDFOntologyData();

            //ConceptScheme
            result.AddFact(this);
            result.AddClassTypeRelation(this, RDFVocabulary.SKOS.CONCEPT_SCHEME.ToRDFOntologyClass());

            //Concepts
            foreach (RDFSKOSConcept c in this)
            {
                result.AddFact(c);
                result.AddClassTypeRelation(c, RDFVocabulary.SKOS.CONCEPT.ToRDFOntologyClass());
                result.AddAssertionRelation(c, RDFVocabulary.SKOS.IN_SCHEME.ToRDFOntologyObjectProperty(), this);
            }

            //Collections
            foreach (RDFSKOSCollection c in this.Collections.Values)
            {
                result.AddAssertionRelation(c, RDFVocabulary.SKOS.IN_SCHEME.ToRDFOntologyObjectProperty(), this);
                result = result.UnionWith(c.ToRDFOntologyData());
            }

            //OrderedCollections
            foreach (RDFSKOSOrderedCollection o in this.OrderedCollections.Values)
            {
                result.AddAssertionRelation(o, RDFVocabulary.SKOS.IN_SCHEME.ToRDFOntologyObjectProperty(), this);
                result = result.UnionWith(o.ToRDFOntologyData());
            }

            //Labels
            foreach (RDFSKOSLabel l in this.Labels.Values)
            {
                result.AddFact(l);
                result.AddClassTypeRelation(l, RDFVocabulary.SKOS.SKOSXL.LABEL.ToRDFOntologyClass());
                result.AddAssertionRelation(l, RDFVocabulary.SKOS.IN_SCHEME.ToRDFOntologyObjectProperty(), this);
            }

            //Assertions
            result.Relations.Assertions = result.Relations.Assertions.UnionWith(this.Relations.TopConcept)
                                          .UnionWith(this.Relations.Broader)
                                          .UnionWith(this.Relations.BroaderTransitive)
                                          .UnionWith(this.Relations.BroadMatch)
                                          .UnionWith(this.Relations.Narrower)
                                          .UnionWith(this.Relations.NarrowerTransitive)
                                          .UnionWith(this.Relations.NarrowMatch)
                                          .UnionWith(this.Relations.Related)
                                          .UnionWith(this.Relations.RelatedMatch)
                                          .UnionWith(this.Relations.SemanticRelation)
                                          .UnionWith(this.Relations.MappingRelation)
                                          .UnionWith(this.Relations.CloseMatch)
                                          .UnionWith(this.Relations.ExactMatch)
                                          .UnionWith(this.Relations.Notation)
                                          .UnionWith(this.Relations.PrefLabel)
                                          .UnionWith(this.Relations.AltLabel)
                                          .UnionWith(this.Relations.HiddenLabel)
                                          .UnionWith(this.Relations.LiteralForm)
                                          .UnionWith(this.Relations.LabelRelation);


            //Annotations
            result.Annotations.CustomAnnotations = result.Annotations.CustomAnnotations.UnionWith(this.Annotations.PrefLabel)
                                                   .UnionWith(this.Annotations.AltLabel)
                                                   .UnionWith(this.Annotations.HiddenLabel)
                                                   .UnionWith(this.Annotations.Note)
                                                   .UnionWith(this.Annotations.ChangeNote)
                                                   .UnionWith(this.Annotations.EditorialNote)
                                                   .UnionWith(this.Annotations.HistoryNote)
                                                   .UnionWith(this.Annotations.ScopeNote)
                                                   .UnionWith(this.Annotations.Definition)
                                                   .UnionWith(this.Annotations.Example);

            return(result);
        }
        /// <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 enumerate members and check if they are contained in the ontology data
                var enumMembers  = this.EnumerateMembersEnumerator();
                while (enumMembers.MoveNext()) {
                    var ontFact  = ontology.Data.SelectFact(enumMembers.Current.ToString());
                    if (ontFact != null) {
                        facts.AddFact(ontFact);
                    }
                }

            }
            return facts;
        }
        /// <summary>
        /// Subsumes the "owl:differentFrom" taxonomy to discover direct and indirect differentFacts of the given facts
        /// </summary>
        internal static RDFOntologyData EnlistDifferentFactsFrom_Core(RDFOntologyFact ontFact,
                                                                      RDFOntologyData data,
                                                                      Dictionary<Int64, RDFOntologyFact> visitContext) {
            var result        = new RDFOntologyData();

            #region visitContext
            if (visitContext == null) {
                visitContext  = new Dictionary<Int64, RDFOntologyFact>() { { ontFact.PatternMemberID, ontFact } };
            }
            else {
                if (!visitContext.ContainsKey(ontFact.PatternMemberID)) {
                     visitContext.Add(ontFact.PatternMemberID, ontFact);
                }
                else {
                    return result;
                }
            }
            #endregion

            // Inference: (A DIFFERENTFROM B  &&  B SAMEAS C         =>  A DIFFERENTFROM C)
            foreach (var      df in data.Relations.DifferentFrom.SelectEntriesBySubject(ontFact)) {
                result.AddFact((RDFOntologyFact)df.TaxonomyObject);
                result        = result.UnionWith(RDFSemanticsUtilities.EnlistSameFactsAs_Core((RDFOntologyFact)df.TaxonomyObject, data, visitContext));
            }

            // Inference: (A SAMEAS B         &&  B DIFFERENTFROM C  =>  A DIFFERENTFROM C)
            foreach (var     sa in RDFOntologyReasoningHelper.EnlistSameFactsAs(ontFact, data)) {
                result        = result.UnionWith(RDFSemanticsUtilities.EnlistDifferentFactsFrom_Core(sa, data, visitContext));
            }

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

                //Retrieve ontology data facts having the restricted property in their attributes
                var facts         = base.EnlistMembers(ontology);

                //Item2 is a counter for occurrences of the restricted property with a range fact of the restricted "FromClass"
                //Item3 is a counter for occurrences of the restricted property with a range fact not of the restricted "FromClass"
                var factsRegister = new Dictionary<Int64, Tuple<RDFOntologyFact, Int64, Int64>>();

                //Iterate the ontology data facts
                foreach(var f in facts) {

                    //Iterate the ontology attributes of the current ontology fact
                    var factOntAttributesEnum       = f.OntologyAttributesEnumerator();
                    while (factOntAttributesEnum.MoveNext()) {
                        if (factOntAttributesEnum.Current.AttributeProperty.Equals(this.OnProperty)) {
                            if (!factsRegister.ContainsKey(f.PatternMemberID)) {
                                factsRegister.Add(f.PatternMemberID, new Tuple<RDFOntologyFact, Int64, Int64>(f, 0, 0));
                            }

                            //Iterate the class types of the candidate ontology fact and check presence of the restriction "FromClass"
                            Boolean fromClassFound  = false;
                            var factClassTypesEnum  = factOntAttributesEnum.Current.AttributeValue.ClassTypesEnumerator();
                            while (!fromClassFound && factClassTypesEnum.MoveNext()) {
                                if (factClassTypesEnum.Current.Equals(this.FromClass)) {
                                    fromClassFound  = true;
                                }
                            }

                            //Update the occurrence counters of the candidate fact
                            Int64 actualEqCounter   = factsRegister[f.PatternMemberID].Item2;
                            Int64 actualDiffCounter = factsRegister[f.PatternMemberID].Item3;
                            if (fromClassFound) {
                                factsRegister[f.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>(f, actualEqCounter + 1, actualDiffCounter);
                            }
                            else {
                                factsRegister[f.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>(f, actualEqCounter, actualDiffCounter + 1);
                            }

                        }
                    }

                }

                //Apply the value restrictions on the candidate ontology facts
                var factsRegEnum = factsRegister.Values.GetEnumerator();
                while (factsRegEnum.MoveNext()) {
                    switch (this.Category) {
                        case RDFSemanticsEnums.RDFOntologyValuesFromRestrictionCategory.AllValuesFrom:
                            if (factsRegEnum.Current.Item2 >= 1 && factsRegEnum.Current.Item3 == 0) {
                                resultFacts.AddFact(factsRegEnum.Current.Item1);
                            }
                            break;
                        case RDFSemanticsEnums.RDFOntologyValuesFromRestrictionCategory.SomeValuesFrom:
                            if (factsRegEnum.Current.Item2 >= 1) {
                                resultFacts.AddFact(factsRegEnum.Current.Item1);
                            }
                            break;
                    }
                }

            }
            return resultFacts;
        }
 /// <summary>
 /// Checks if the given aFact is differentFrom the given bFact within the given data
 /// </summary>
 public static Boolean IsDifferentFactFrom(RDFOntologyFact aFact, RDFOntologyFact bFact, RDFOntologyData data) {
     return (aFact != null && bFact != null && data != null ? RDFOntologyReasoningHelper.EnlistDifferentFactsFrom(aFact, data).Facts.ContainsKey(bFact.PatternMemberID) : false);
 }
 /// <summary>
 /// Checks if the given aFact is sameAs the given bFact within the given data
 /// </summary>
 public static Boolean IsSameFactAs(RDFOntologyFact aFact, RDFOntologyFact bFact, RDFOntologyData data) {
     return (aFact != null && bFact != null && data != null ? RDFOntologyReasoningHelper.EnlistSameFactsAs(aFact, data).Facts.ContainsKey(bFact.PatternMemberID) : false);
 }
Exemplo n.º 11
0
        /// <summary>
        /// Enlists the facts which are members of the given class within the given ontology
        /// </summary>
        internal static RDFOntologyData EnlistMembersOfClass(RDFOntologyClass ontClass, RDFOntology ontology) {
            var result         = new RDFOntologyData();

            //DataRange / Literal
            if (ontClass.IsDataRangeClass()                                                         
                || ontClass.Equals(RDFOntologyVocabulary.Classes.LITERAL)
                || RDFOntologyReasoningHelper.IsSubClassOf(ontClass, RDFOntologyVocabulary.Classes.LITERAL, ontology.Model.ClassModel)
                || RDFOntologyReasoningHelper.IsEquivalentClassOf(ontClass, RDFOntologyVocabulary.Classes.LITERAL, ontology.Model.ClassModel)) {

                //DataRange
                if (ontClass.IsDataRangeClass()) {
                    result     = RDFSemanticsUtilities.EnlistMembersOfDataRange((RDFOntologyDataRangeClass)ontClass, ontology);
                }

                //Literal
                else { 
                    
                    //Pure Literal
                    if (ontClass.Equals(RDFOntologyVocabulary.Classes.LITERAL)                                                            || 
                        RDFOntologyReasoningHelper.IsEquivalentClassOf(ontClass, RDFOntologyVocabulary.Classes.LITERAL, ontology.Model.ClassModel)) {
                        foreach (var ontLit in ontology.Data.Literals.Values) {
                            result.AddLiteral(ontLit);
                        }
                    }

                    //Derived Literal
                    else {

                        //String-Literals
                        var xsdStringClass          = ontology.Model.ClassModel.SelectClass(RDFVocabulary.XSD.STRING.ToString());
                        if (ontClass.Equals(xsdStringClass)                                                            || 
                            RDFOntologyReasoningHelper.IsEquivalentClassOf(ontClass, xsdStringClass, ontology.Model.ClassModel)) {
                            foreach (var ontLit    in ontology.Data.Literals.Values) {
                                if  (ontLit.Value  is RDFPlainLiteral) {
                                     result.AddLiteral(ontLit);
                                }
                                else {
                                    var dTypeClass  = ontology.Model.ClassModel.SelectClass(((RDFTypedLiteral)ontLit.Value).Datatype.ToString());
                                    if (dTypeClass != null) {
                                        if (dTypeClass.Equals(ontClass)                                                     ||
                                            RDFOntologyReasoningHelper.IsSubClassOf(dTypeClass, ontClass, ontology.Model.ClassModel) ||
                                            RDFOntologyReasoningHelper.IsEquivalentClassOf(dTypeClass, ontClass, ontology.Model.ClassModel)) {
                                            result.AddLiteral(ontLit);
                                        }
                                    }
                                    else {
                                        if (dTypeClass.Equals(ontClass)) {
                                            result.AddLiteral(ontLit);
                                        }
                                    }
                                }
                            }
                        }

                        //Other Literals
                        else {
                            foreach (var ontLit  in ontology.Data.Literals.Values.Where(l => l.Value is RDFTypedLiteral)) {
                                var  dTypeClass   = ontology.Model.ClassModel.SelectClass(((RDFTypedLiteral)ontLit.Value).Datatype.ToString());
                                if  (dTypeClass  != null) {
                                    if (dTypeClass.Equals(ontClass)                                                            ||
                                        RDFOntologyReasoningHelper.IsSubClassOf(dTypeClass, ontClass, ontology.Model.ClassModel)        ||
                                        RDFOntologyReasoningHelper.IsEquivalentClassOf(dTypeClass, ontClass, ontology.Model.ClassModel)) {
                                        result.AddLiteral(ontLit);
                                    }
                                }
                                else {
                                    if (dTypeClass.Equals(ontClass)) {
                                        result.AddLiteral(ontLit);
                                    }
                                }
                            }
                        }

                    }

                }

            }

            //Composite
            else if (ontClass.IsCompositeClass()) {
                result         = RDFSemanticsUtilities.EnlistMembersOfComposite(ontClass, ontology);
            }

            //Enumerate
            else if (ontClass.IsEnumerateClass()) {
                result         = RDFSemanticsUtilities.EnlistMembersOfEnumerate((RDFOntologyEnumerateClass)ontClass, ontology);
            }

            //Class
            else {

                //Get the compatible classes
                var compCls    = RDFOntologyReasoningHelper.EnlistSubClassesOf(ontClass, ontology.Model.ClassModel)
                                     .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(ontClass, ontology.Model.ClassModel))
                                        .AddClass(ontClass);

                //Filter "classType" relations made with compatible classes
                var fTaxonomy  = new RDFOntologyTaxonomy();
                foreach (var   c in compCls) {
                    fTaxonomy  = fTaxonomy.UnionWith(ontology.Data.Relations.ClassType.SelectEntriesByObject(c));
                }
                foreach (var   tEntry in fTaxonomy) {

                    //Add the fact and its synonyms
                    if (tEntry.TaxonomySubject.IsFact()) {
                        result = result.UnionWith(RDFOntologyReasoningHelper.EnlistSameFactsAs((RDFOntologyFact)tEntry.TaxonomySubject, ontology.Data))
                                          .AddFact((RDFOntologyFact)tEntry.TaxonomySubject);
                    }

                }

            }

            return result;
        }
Exemplo n.º 12
0
        /// <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;
        }
Exemplo n.º 13
0
        /// <summary>
        /// Enlists the literals which are members of the given datarange within the given ontology
        /// </summary>
        internal static RDFOntologyData EnlistMembersOfDataRange(RDFOntologyDataRangeClass ontDataRangeClass, RDFOntology ontology) {
            var result     = new RDFOntologyData();

            //Filter "oneOf" relations made with the given datarange class
            var drTaxonomy = ontology.Model.ClassModel.Relations.OneOf.SelectEntriesBySubject(ontDataRangeClass);
            foreach (var   tEntry  in drTaxonomy) {

                //Add the literal
                if  (tEntry.TaxonomyObject.IsLiteral()) {
                     result.AddLiteral((RDFOntologyLiteral)tEntry.TaxonomyObject);
                }

            }

            return result;
        }
Exemplo n.º 14
0
        /// <summary>
        /// Enlists the facts which are members of the given enumeration within the given ontology
        /// </summary>
        internal static RDFOntologyData EnlistMembersOfEnumerate(RDFOntologyEnumerateClass ontEnumClass, RDFOntology ontology) {
            var result     = new RDFOntologyData();

            //Filter "oneOf" relations made with the given enumerate class
            var enTaxonomy = ontology.Model.ClassModel.Relations.OneOf.SelectEntriesBySubject(ontEnumClass);
            foreach (var   tEntry in enTaxonomy) {
                
                //Add the fact and its synonyms
                if  (tEntry.TaxonomyObject.IsFact()) {
                     result= result.UnionWith(RDFOntologyReasoningHelper.EnlistSameFactsAs((RDFOntologyFact)tEntry.TaxonomyObject, ontology.Data))
                                      .AddFact((RDFOntologyFact)tEntry.TaxonomyObject);
                }

            }

            return result;
        }
Exemplo n.º 15
0
        /// <summary>
        /// Enlists the facts which are members of the given restriction within the given ontology
        /// </summary>
        internal static RDFOntologyData EnlistMembersOfRestriction(RDFOntologyRestriction ontRestriction, RDFOntology ontology) {
            var result     = new RDFOntologyData();

            //Enlist the properties which are compatible with the restriction's "OnProperty"
            var compProps  = RDFOntologyReasoningHelper.EnlistSubPropertiesOf(ontRestriction.OnProperty, ontology.Model.PropertyModel)
                                 .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentPropertiesOf(ontRestriction.OnProperty, ontology.Model.PropertyModel))
                                    .AddProperty(ontRestriction.OnProperty);
            
            //Filter assertions made with enlisted compatible properties
            var fTaxonomy  = new RDFOntologyTaxonomy();
            foreach (var   p in compProps) {
                fTaxonomy  = fTaxonomy.UnionWith(ontology.Data.Relations.Assertions.SelectEntriesByPredicate(p));
            }

            #region Cardinality
            if (ontRestriction is RDFOntologyCardinalityRestriction) {

                //Item2 is a counter for occurrences of the restricted property within the subject fact
                var fCount = new Dictionary<Int64, Tuple<RDFOntologyFact, Int64>>();
                
                //Iterate the compatible assertions
                foreach (var tEntry in fTaxonomy) {
                    if  (!fCount.ContainsKey(tEntry.TaxonomySubject.PatternMemberID)) {
                          fCount.Add(tEntry.TaxonomySubject.PatternMemberID, new Tuple<RDFOntologyFact, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, 1));
                    }
                    else {
                        var occurrencyCounter                          = fCount[tEntry.TaxonomySubject.PatternMemberID].Item2;
                        fCount[tEntry.TaxonomySubject.PatternMemberID] = new Tuple<RDFOntologyFact, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, occurrencyCounter + 1);
                    }
                }

                //Apply the cardinality restriction on the tracked facts
                var fCountEnum   = fCount.Values.GetEnumerator();
                while (fCountEnum.MoveNext()) {
                    var passesMinCardinality     = true;
                    var passesMaxCardinality     = true;

                    //MinCardinality: signal tracked facts having "#occurrences < MinCardinality"
                    if (((RDFOntologyCardinalityRestriction)ontRestriction).MinCardinality > 0) {
                        if (fCountEnum.Current.Item2 < ((RDFOntologyCardinalityRestriction)ontRestriction).MinCardinality) {
                            passesMinCardinality = false;
                        }
                    }

                    //MaxCardinality: signal tracked facts having "#occurrences > MaxCardinality"
                    if (((RDFOntologyCardinalityRestriction)ontRestriction).MaxCardinality > 0) {
                        if (fCountEnum.Current.Item2 > ((RDFOntologyCardinalityRestriction)ontRestriction).MaxCardinality) {
                            passesMaxCardinality = false;
                        }
                    }

                    //Save the candidate fact if it passes cardinality restrictions
                    if (passesMinCardinality    && passesMaxCardinality) {
                        result.AddFact(fCountEnum.Current.Item1);
                    }
                }

            }
            #endregion

            #region AllValuesFrom
            else if (ontRestriction is RDFOntologyAllValuesFromRestriction) {

                //Item2 is a counter for occurrences of the restricted property with a range member of the restricted "FromClass"
                //Item3 is a counter for occurrences of the restricted property with a range member not of the restricted "FromClass"
                var fCount      = new Dictionary<Int64, Tuple<RDFOntologyFact, Int64, Int64>>();

                //Enlist the classes which are compatible with the restricted "FromClass"
                var compClasses = RDFOntologyReasoningHelper.EnlistSubClassesOf(((RDFOntologyAllValuesFromRestriction)ontRestriction).FromClass, ontology.Model.ClassModel)
                                      .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(((RDFOntologyAllValuesFromRestriction)ontRestriction).FromClass, ontology.Model.ClassModel))
                                         .AddClass(((RDFOntologyAllValuesFromRestriction)ontRestriction).FromClass);

                //Iterate the compatible assertions
                foreach (var tEntry in fTaxonomy) {

                    //Initialize the occurrence counters of the subject fact
                    if (!fCount.ContainsKey(tEntry.TaxonomySubject.PatternMemberID)) {
                         fCount.Add(tEntry.TaxonomySubject.PatternMemberID, new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, 0, 0));
                    }

                    //Iterate the class types of the object fact, checking presence of the restricted "FromClass"
                    var fromClassFound            = false;
                    var objFactClassTypes         = ontology.Data.Relations.ClassType.SelectEntriesBySubject(tEntry.TaxonomyObject);
                    foreach (var objFactClassType in objFactClassTypes) {
                        var compObjFactClassTypes = RDFOntologyReasoningHelper.EnlistSubClassesOf((RDFOntologyClass)objFactClassType.TaxonomyObject, ontology.Model.ClassModel)
                                                        .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf((RDFOntologyClass)objFactClassType.TaxonomyObject, ontology.Model.ClassModel))
                                                            .AddClass((RDFOntologyClass)objFactClassType.TaxonomyObject);
                        if  (compObjFactClassTypes.IntersectWith(compClasses).ClassesCount > 0) {
                             fromClassFound       = true;
                             break;
                        }
                    }

                    //Update the occurrence counters of the subject fact
                    var equalityCounter           = fCount[tEntry.TaxonomySubject.PatternMemberID].Item2;
                    var differenceCounter         = fCount[tEntry.TaxonomySubject.PatternMemberID].Item3;
                    if (fromClassFound) {
                        fCount[tEntry.TaxonomySubject.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, equalityCounter + 1, differenceCounter);
                    }
                    else {
                        fCount[tEntry.TaxonomySubject.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, equalityCounter, differenceCounter + 1);
                    }

                }

                //Apply the restriction on the subject facts
                var fCountEnum    = fCount.Values.GetEnumerator();
                while  (fCountEnum.MoveNext()) {
                    if (fCountEnum.Current.Item2 >= 1 && fCountEnum.Current.Item3 == 0) {
                        result.AddFact(fCountEnum.Current.Item1);
                    }
                }

            }
            #endregion

            #region SomeValuesFrom
            else if (ontRestriction is RDFOntologySomeValuesFromRestriction) {

                //Item2 is a counter for occurrences of the restricted property with a range member of the restricted "FromClass"
                //Item3 is a counter for occurrences of the restricted property with a range member not of the restricted "FromClass"
                var fCount      = new Dictionary<Int64, Tuple<RDFOntologyFact, Int64, Int64>>();

                //Enlist the classes which are compatible with the restricted "FromClass"
                var compClasses = RDFOntologyReasoningHelper.EnlistSubClassesOf(((RDFOntologySomeValuesFromRestriction)ontRestriction).FromClass, ontology.Model.ClassModel)
                                      .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(((RDFOntologySomeValuesFromRestriction)ontRestriction).FromClass, ontology.Model.ClassModel))
                                         .AddClass(((RDFOntologySomeValuesFromRestriction)ontRestriction).FromClass);

                //Iterate the compatible assertions
                foreach (var tEntry in fTaxonomy) {

                    //Initialize the occurrence counters of the subject fact
                    if (!fCount.ContainsKey(tEntry.TaxonomySubject.PatternMemberID)) {
                         fCount.Add(tEntry.TaxonomySubject.PatternMemberID, new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, 0, 0));
                    }

                    //Iterate the class types of the object fact, checking presence of the restricted "FromClass"
                    var fromClassFound            = false;
                    var objFactClassTypes         = ontology.Data.Relations.ClassType.SelectEntriesBySubject(tEntry.TaxonomyObject);
                    foreach (var objFactClassType in objFactClassTypes) {
                        var compObjFactClassTypes = RDFOntologyReasoningHelper.EnlistSubClassesOf((RDFOntologyClass)objFactClassType.TaxonomyObject, ontology.Model.ClassModel)
                                                        .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf((RDFOntologyClass)objFactClassType.TaxonomyObject, ontology.Model.ClassModel))
                                                            .AddClass((RDFOntologyClass)objFactClassType.TaxonomyObject);
                        if  (compObjFactClassTypes.IntersectWith(compClasses).ClassesCount > 0) {
                             fromClassFound       = true;
                             break;
                        }
                    }

                    //Update the occurrence counters of the subject fact
                    var equalityCounter           = fCount[tEntry.TaxonomySubject.PatternMemberID].Item2;
                    var differenceCounter         = fCount[tEntry.TaxonomySubject.PatternMemberID].Item3;
                    if (fromClassFound) {
                        fCount[tEntry.TaxonomySubject.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, equalityCounter + 1, differenceCounter);
                    }
                    else {
                        fCount[tEntry.TaxonomySubject.PatternMemberID] = new Tuple<RDFOntologyFact, Int64, Int64>((RDFOntologyFact)tEntry.TaxonomySubject, equalityCounter, differenceCounter + 1);
                    }

                }

                //Apply the restriction on the subject facts
                var fCountEnum    = fCount.Values.GetEnumerator();
                while  (fCountEnum.MoveNext()) {
                    if (fCountEnum.Current.Item2 >= 1) {
                        result.AddFact(fCountEnum.Current.Item1);
                    }
                }

            }
            #endregion

            #region HasValue
            else if (ontRestriction is RDFOntologyHasValueRestriction) {                
                if (((RDFOntologyHasValueRestriction)ontRestriction).RequiredValue.IsFact()) {

                    //Enlist the same facts of the restriction's "RequiredValue"
                    var compFacts = RDFOntologyReasoningHelper.EnlistSameFactsAs((RDFOntologyFact)((RDFOntologyHasValueRestriction)ontRestriction).RequiredValue, ontology.Data)
                                        .AddFact((RDFOntologyFact)((RDFOntologyHasValueRestriction)ontRestriction).RequiredValue);

                    //Iterate the compatible assertions
                    foreach (var  tEntry in fTaxonomy) {
                        if  (tEntry.TaxonomyObject.IsFact()) {
                             if (compFacts.SelectFact(tEntry.TaxonomyObject.ToString()) != null) {
                                 result.AddFact((RDFOntologyFact)tEntry.TaxonomyObject);
                             }
                        }
                    }

                }
                else if (((RDFOntologyHasValueRestriction)ontRestriction).RequiredValue.IsLiteral()) {

                    //Iterate the compatible assertions and track the occurrence informations
                    foreach (var  tEntry in fTaxonomy) {
                        if  (tEntry.TaxonomyObject.IsLiteral()) {
                             try {
                                 var semanticLiteralsCompare  = RDFQueryUtilities.CompareRDFPatternMembers(((RDFOntologyHasValueRestriction)ontRestriction).RequiredValue.Value, tEntry.TaxonomyObject.Value);
                                 if (semanticLiteralsCompare == 0) {
                                     result.AddFact((RDFOntologyFact)tEntry.TaxonomySubject);
                                 }
                             }
                             finally { }
                        }
                    }

                }
            }
            #endregion

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

                //Retrieve ontology data facts having the restricted property in their attributes
                var facts         = base.EnlistMembers(ontology);

                //Item2 is a counter for occurrences of the restricted property within the key fact
                var factsRegister = new Dictionary<Int64, Tuple<RDFOntologyFact, Int64>>();

                //Iterate the retrieved ontology data facts
                foreach(var f in facts) {

                    //Iterate the ontology attributes of the current ontology fact
                    var factOntAttributesEnum = f.OntologyAttributesEnumerator();
                    while (factOntAttributesEnum.MoveNext()) {
                        if (factOntAttributesEnum.Current.AttributeProperty.Equals(this.OnProperty)) {
                                //Register the ontology data fact or update its property occurrence counter
                                if (!factsRegister.ContainsKey(f.PatternMemberID)) {
                                    factsRegister.Add(f.PatternMemberID, new Tuple<RDFOntologyFact, Int64>(f, 1));
                                }
                                else {
                                    Int64 actualCounter = factsRegister[f.PatternMemberID].Item2;
                                    factsRegister[f.PatternMemberID] = new Tuple<RDFOntologyFact, Int64>(f, actualCounter + 1);
                                }
                        }
                    }

                }

                //Apply the cardinality restrictions on the candidate ontology facts
                var factsRegEnum  = factsRegister.Values.GetEnumerator();
                while (factsRegEnum.MoveNext()) {
                    Boolean passesMinCardinality = true;
                    Boolean passesMaxCardinality = true;

                    //MinCardinality: signal candidate facts having "#occurrences < MinCardinality"
                    if (this.MinCardinality > 0) {
                        if (factsRegEnum.Current.Item2 < this.MinCardinality) {
                            passesMinCardinality = false;                            
                        }
                    }

                    //MaxCardinality: signal candidate facts having "#occurrences > MaxCardinality"
                    if (this.MaxCardinality > 0) {
                        if (factsRegEnum.Current.Item2 > this.MaxCardinality) {
                            passesMaxCardinality = false;
                        }
                    }

                    //Save the candidate fact if it passes cardinality restrictions
                    if (passesMinCardinality && passesMaxCardinality) {
                        resultFacts.AddFact(factsRegEnum.Current.Item1);
                    }
                }

            }
            return resultFacts;
        }
 /// <summary>
 /// Enlists the different facts of the given fact within the given data
 /// </summary>
 public static RDFOntologyData EnlistDifferentFactsFrom(RDFOntologyFact ontFact, RDFOntologyData data) {
     var result     = new RDFOntologyData();
     if (ontFact   != null && data != null) {
         result     = RDFSemanticsUtilities.EnlistDifferentFactsFrom_Core(ontFact, data, null).RemoveFact(ontFact);
     }
     return result;
 }
        /// <summary>
        /// Enlists the facts which are members of the given class within the given ontology
        /// </summary>
        public static RDFOntologyData EnlistMembersOf(RDFOntologyClass ontClass, RDFOntology ontology) {
            var result      = new RDFOntologyData();
            if (ontClass   != null && ontology != null) {
                
                //Restriction
                if (ontClass.IsRestrictionClass()) {
                    result  = RDFSemanticsUtilities.EnlistMembersOfRestriction((RDFOntologyRestriction)ontClass,  ontology);
                }

                //Enumeration
                else if (ontClass.IsEnumerateClass()) {
                    result  = RDFSemanticsUtilities.EnlistMembersOfEnumerate((RDFOntologyEnumerateClass)ontClass, ontology);
                }

                //DataRange
                else if (ontClass.IsDataRangeClass()) {
                    result  = RDFSemanticsUtilities.EnlistMembersOfDataRange((RDFOntologyDataRangeClass)ontClass, ontology);
                }

                //Composite
                else if (ontClass.IsCompositeClass()) {
                    result  = RDFSemanticsUtilities.EnlistMembersOfComposite(ontClass, ontology);
                }

                //SimpleClass
                else {
                    result  = RDFSemanticsUtilities.EnlistMembersOfClass(ontClass, ontology);
                }

            }
            return result;
        }
        /// <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 union class
                var compClassEnum = this.CompositingClassesEnumerator();
                while (compClassEnum.MoveNext()) {

                    //Compose them with a union logic
                    facts         = facts.UnionWith(compClassEnum.Current.EnlistMembers(ontology));

                }

            }
            return facts;
        }
Exemplo n.º 20
0
        /// <summary>
        /// Subsumes the "owl:sameAs" taxonomy to discover direct and indirect samefacts of the given facts
        /// </summary>
        internal static RDFOntologyData EnlistSameFactsAs_Core(RDFOntologyFact ontFact,
                                                               RDFOntologyData data,
                                                               Dictionary<Int64, RDFOntologyFact> visitContext) {
            var result        = new RDFOntologyData();

            #region visitContext
            if (visitContext == null) {
                visitContext  = new Dictionary<Int64, RDFOntologyFact>() { { ontFact.PatternMemberID, ontFact } };
            }
            else {
                if (!visitContext.ContainsKey(ontFact.PatternMemberID)) {
                     visitContext.Add(ontFact.PatternMemberID, ontFact);
                }
                else {
                    return result;
                }
            }
            #endregion

            // Transitivity of "owl:sameAs" taxonomy: ((A SAMEAS B)  &&  (B SAMEAS C))  =>  (A SAMEAS C)
            foreach (var      sf in data.Relations.SameAs.SelectEntriesBySubject(ontFact)) {
                result.AddFact((RDFOntologyFact)sf.TaxonomyObject);
                result        = result.UnionWith(RDFSemanticsUtilities.EnlistSameFactsAs_Core((RDFOntologyFact)sf.TaxonomyObject, data, visitContext));
            }

            return result;
        }