Exemplo n.º 1
0
        /// <summary>
        /// Gets an ontology data representation of this collection
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            RDFOntologyData result = new RDFOntologyData();

            //Collection
            result.AddFact(this);
            result.AddClassTypeRelation(this, RDFVocabulary.SKOS.COLLECTION.ToRDFOntologyClass());

            //Concepts
            foreach (RDFSKOSConcept cn in this.Concepts.Values)
            {
                result.AddFact(cn);
                result.AddClassTypeRelation(cn, RDFVocabulary.SKOS.CONCEPT.ToRDFOntologyClass());
                result.AddMemberRelation(this, cn);
            }

            //Collections
            foreach (RDFSKOSCollection cl in this.Collections.Values)
            {
                result.AddMemberRelation(this, cl);

                //Recursively add linked SKOS collection
                result = result.UnionWith(cl.ToRDFOntologyData());
            }

            return(result);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Gets an ontology data representation of this collection
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            var result = new RDFOntologyData();

            //Collection
            result.AddFact(this);
            result.AddClassTypeRelation(this, RDFVocabulary.SKOS.COLLECTION.ToRDFOntologyClass());

            //Concepts
            foreach (var cn in this.Concepts.Values)
            {
                result.AddFact(cn);
                result.AddClassTypeRelation(cn, RDFVocabulary.SKOS.CONCEPT.ToRDFOntologyClass());
                result.AddAssertionRelation(this, RDFVocabulary.SKOS.MEMBER.ToRDFOntologyObjectProperty(), cn);
            }

            //Collections
            foreach (var cl in this.Collections.Values)
            {
                result.AddAssertionRelation(this, RDFVocabulary.SKOS.MEMBER.ToRDFOntologyObjectProperty(), cl);
                result = result.UnionWith(cl.ToRDFOntologyData());
            }

            return(result);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Gets an ontology data representation of this collection
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            var result = new RDFOntologyData();

            //OrderedCollection
            result.AddFact(this);
            result.AddClassTypeRelation(this, RDFVocabulary.SKOS.ORDERED_COLLECTION.ToRDFOntologyClass());
            result.AddAssertionRelation(this, RDFVocabulary.SKOS.MEMBER_LIST.ToRDFOntologyObjectProperty(), this.Representative);

            //Representative
            result.AddFact(this.Representative);

            //Concepts
            var reifSubj = new RDFOntologyFact((RDFResource)this.Representative.Value);

            if (this.ConceptsCount == 0)
            {
                result.Relations.ClassType.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.TYPE.ToRDFOntologyObjectProperty(), RDFVocabulary.RDF.LIST.ToRDFOntologyClass()));
                result.Relations.Assertions.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.FIRST.ToRDFOntologyObjectProperty(), RDFVocabulary.RDF.NIL.ToRDFOntologyFact()));
                result.Relations.Assertions.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.REST.ToRDFOntologyObjectProperty(), RDFVocabulary.RDF.NIL.ToRDFOntologyFact()));
            }
            else
            {
                var itemCounter  = 0;
                var conceptsEnum = this.ConceptsEnumerator;
                while (conceptsEnum.MoveNext())
                {
                    result.AddFact(conceptsEnum.Current.Item2);
                    result.AddClassTypeRelation(conceptsEnum.Current.Item2, RDFVocabulary.SKOS.CONCEPT.ToRDFOntologyClass());

                    //first
                    result.Relations.ClassType.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.TYPE.ToRDFOntologyObjectProperty(), RDFVocabulary.RDF.LIST.ToRDFOntologyClass()));
                    result.Relations.Assertions.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.FIRST.ToRDFOntologyObjectProperty(), conceptsEnum.Current.Item2));

                    //rest
                    itemCounter++;
                    if (itemCounter < this.ConceptsCount)
                    {
                        var newReifSubj = new RDFOntologyFact(new RDFResource());
                        result.Relations.Assertions.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.REST.ToRDFOntologyObjectProperty(), newReifSubj));
                        reifSubj = newReifSubj;
                    }
                    else
                    {
                        result.Relations.Assertions.AddEntry(new RDFOntologyTaxonomyEntry(reifSubj, RDFVocabulary.RDF.REST.ToRDFOntologyObjectProperty(), RDFVocabulary.RDF.NIL.ToRDFOntologyFact()));
                    }
                }
            }

            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);

                //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;
        }
Exemplo n.º 5
0
        /// <summary>
        /// Gets an ontology data representation of this collection
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            RDFOntologyData result = new RDFOntologyData();

            //OrderedCollection
            result.AddFact(this);
            result.AddClassTypeRelation(this, RDFVocabulary.SKOS.ORDERED_COLLECTION.ToRDFOntologyClass());

            //Concepts
            foreach (RDFSKOSConcept cn in this.GetMembers())
            {
                result.AddFact(cn);
                result.AddClassTypeRelation(cn, RDFVocabulary.SKOS.CONCEPT.ToRDFOntologyClass());
                result.AddMemberListRelation(this, cn);
            }

            return(result);
        }
        /// <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 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;
        }
Exemplo n.º 8
0
        /// <summary>
        /// Gets an ontology data representation of this scheme
        /// </summary>
        public RDFOntologyData ToRDFOntologyData()
        {
            var result = new RDFOntologyData();

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

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

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

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

            //Labels
            foreach (var 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 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>
        /// 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;
        }
Exemplo n.º 11
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;
        }
Exemplo n.º 12
0
        /// <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;
        }
Exemplo n.º 13
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;
        }