/// <summary>
 /// Checks if the given aclass can be set disjointwith the given bclass
 /// </summary>
 internal static Boolean CheckDisjointWithCompatibility(RDFOntologyClassModel classModel,
                                                        RDFOntologyClass aClass,
                                                        RDFOntologyClass bClass)
 {
     return(!classModel.CheckIsSubClassOf(aClass, bClass) &&
            !classModel.CheckIsSuperClassOf(aClass, bClass) &&
            !classModel.CheckIsEquivalentClassOf(aClass, bClass));
 }
 /// <summary>
 /// Checks if the given childclass can be set subclassof the given motherclass
 /// </summary>
 internal static Boolean CheckSubClassOfCompatibility(RDFOntologyClassModel classModel,
                                                      RDFOntologyClass childClass,
                                                      RDFOntologyClass motherClass)
 {
     return(!classModel.CheckIsSubClassOf(motherClass, childClass) &&
            !classModel.CheckIsEquivalentClassOf(motherClass, childClass) &&
            !classModel.CheckIsDisjointClassWith(motherClass, childClass));
 }
        /// <summary>
        /// Enlists the disjointClasses with the given class within the given class model
        /// </summary>
        public static RDFOntologyClassModel EnlistDisjointClassesWith(RDFOntologyClass ontClass,
                                                                      RDFOntologyClassModel classModel)
        {
            var result = new RDFOntologyClassModel();

            if (ontClass != null && classModel != null)
            {
                result = RDFSemanticsUtilities.EnlistDisjointClassesWith_Core(ontClass, classModel, null)
                         .RemoveClass(ontClass);                          //Safety deletion
            }
            return(result);
        }
        /// <summary>
        /// Checks if the given ontology class is compatible with 'rdfs:Literal' within the given class model
        /// </summary>
        public static Boolean IsLiteralCompatibleClass(RDFOntologyClass ontClass,
                                                       RDFOntologyClassModel classModel)
        {
            var result = false;

            if (ontClass != null && classModel != null)
            {
                result = (ontClass.IsDataRangeClass() ||
                          ontClass.Equals(RDFVocabulary.RDFS.LITERAL.ToRDFOntologyClass()) ||
                          IsSubClassOf(ontClass, RDFVocabulary.RDFS.LITERAL.ToRDFOntologyClass(), classModel));
            }
            return(result);
        }
        /// <summary>
        /// Checks if the given ontology class is compatible with 'rdfs:Literal' within the given class model
        /// </summary>
        public static Boolean IsLiteralCompatibleClass(RDFOntologyClass ontClass,
                                                       RDFOntologyClassModel classModel)
        {
            var result = false;

            if (ontClass != null && classModel != null)
            {
                result = (ontClass.IsDataRangeClass() ||
                          ontClass.Equals(RDFBASEOntology.Instance.Model.ClassModel.SelectClass(RDFVocabulary.RDFS.LITERAL.ToString())) ||
                          IsSubClassOf(ontClass, RDFBASEOntology.Instance.Model.ClassModel.SelectClass(RDFVocabulary.RDFS.LITERAL.ToString()), classModel) ||
                          IsEquivalentClassOf(ontClass, RDFBASEOntology.Instance.Model.ClassModel.SelectClass(RDFVocabulary.RDFS.LITERAL.ToString()), classModel));
            }
            return(result);
        }
        /// <summary>
        /// Enlists the superClasses of the given class within the given class model
        /// </summary>
        public static RDFOntologyClassModel EnlistSuperClassesOf(RDFOntologyClass ontClass, RDFOntologyClassModel classModel) {
            var result       = new RDFOntologyClassModel();
            if (ontClass    != null && classModel != null) {

                //Step 1: Reason on the given class
                result       = RDFSemanticsUtilities.EnlistSuperClassesOf_Core(ontClass, classModel);

                //Step 2: Reason on the equivalent classes of the given class
                foreach(var ec in RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(ontClass, classModel)) {
                    result   = result.UnionWith(RDFSemanticsUtilities.EnlistSuperClassesOf_Core(ec, classModel));
                }

            }
            return result;
        }
        /// <summary>
        /// Enlists the range classes of the given property within the given ontology class model
        /// </summary>
        public static RDFOntologyClassModel EnlistRangeClassesOf(RDFOntologyProperty ontProperty,
                                                                 RDFOntologyClassModel classModel)
        {
            var result = new RDFOntologyClassModel();

            if (ontProperty != null && classModel != null)
            {
                if (ontProperty.Range != null)
                {
                    result = EnlistSubClassesOf(ontProperty.Range, classModel)
                             .UnionWith(EnlistEquivalentClassesOf(ontProperty.Range, classModel))
                             .AddClass(ontProperty.Range);
                }
            }
            return(result);
        }
        /// <summary>
        /// Enlists the superClasses of the given class within the given class model
        /// </summary>
        public static RDFOntologyClassModel EnlistSuperClassesOf(RDFOntologyClass ontClass,
                                                                 RDFOntologyClassModel classModel)
        {
            var result = new RDFOntologyClassModel();

            if (ontClass != null && classModel != null)
            {
                //Step 1: Reason on the given class
                result = RDFSemanticsUtilities.EnlistSuperClassesOf_Core(ontClass, classModel);

                //Step 2: Reason on the equivalent classes
                foreach (var ec in EnlistEquivalentClassesOf(ontClass, classModel))
                {
                    result = result.UnionWith(RDFSemanticsUtilities.EnlistSuperClassesOf_Core(ec, classModel));
                }
            }
            return(result);
        }
 /// <summary>
 /// Checks if the given aClass is superClass of the given bClass within the given class model
 /// </summary>
 public static Boolean IsSuperClassOf(RDFOntologyClass aClass,
                                      RDFOntologyClass bClass,
                                      RDFOntologyClassModel classModel)
 {
     return(aClass != null && bClass != null && classModel != null ? EnlistSubClassesOf(aClass, classModel).Classes.ContainsKey(bClass.PatternMemberID) : false);
 }
Exemplo n.º 10
0
        /// <summary>
        /// Subsumes the "rdfs:subClassOf" taxonomy to discover direct and indirect superClasses of the given class
        /// </summary>
        internal static RDFOntologyClassModel EnlistSuperClassesOf(RDFOntologyClass ontClass, RDFOntologyClassModel classModel) {
            var result  = new RDFOntologyClassModel();

            // Transitivity of "rdfs:subClassOf" taxonomy: ((A SUPERCLASSOF B)  &&  (B SUPERCLASSOF C))  =>  (A SUPERCLASSOF C)
            foreach(var sc in classModel.Relations.SubClassOf.SelectEntriesBySubject(ontClass)) {
                result.AddClass((RDFOntologyClass)sc.TaxonomyObject);
                result  = result.UnionWith(RDFSemanticsUtilities.EnlistSuperClassesOf((RDFOntologyClass)sc.TaxonomyObject, classModel));
            }

            return result;
        }
Exemplo n.º 11
0
        internal static RDFOntologyClassModel EnlistDisjointClassesWith_Core(RDFOntologyClass ontClass, RDFOntologyClassModel classModel, Dictionary<Int64, RDFOntologyClass> visitContext) {
            var result1       = new RDFOntologyClassModel();
            var result2       = new RDFOntologyClassModel();

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

            // Inference: ((A DISJOINTWITH B)   &&  (B EQUIVALENTCLASS C))  =>  (A DISJOINTWITH C)
            foreach (var      dw in classModel.Relations.DisjointWith.SelectEntriesBySubject(ontClass)) {
                result1.AddClass((RDFOntologyClass)dw.TaxonomyObject);
                result1       = result1.UnionWith(RDFSemanticsUtilities.EnlistEquivalentClassesOf_Core((RDFOntologyClass)dw.TaxonomyObject, classModel, visitContext));
            }

            // Inference: ((A DISJOINTWITH B)   &&  (B SUPERCLASS C))  =>  (A DISJOINTWITH C)
            result2           = result2.UnionWith(result1);
            foreach (var      c in result1) {
                result2       = result2.UnionWith(RDFSemanticsUtilities.EnlistSubClassesOf_Core(c, classModel));
            }
            result1           = result1.UnionWith(result2);

            // Inference: ((A EQUIVALENTCLASS B || A SUBCLASSOF B)  &&  (B DISJOINTWITH C))     =>  (A DISJOINTWITH C)
            var compatibleCls = RDFOntologyReasoningHelper.EnlistSuperClassesOf(ontClass, classModel)
                                        .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(ontClass, classModel));
            foreach (var      ec in compatibleCls) {
                result1       = result1.UnionWith(RDFSemanticsUtilities.EnlistDisjointClassesWith_Core(ec, classModel, visitContext));
            }

            return result1;
        }
Exemplo n.º 12
0
        /// <summary>
        /// Subsumes the "owl:equivalentClass" taxonomy to discover direct and indirect equivalentClasses of the given class
        /// </summary>
        internal static RDFOntologyClassModel EnlistEquivalentClassesOf_Core(RDFOntologyClass ontClass, 
                                                                             RDFOntologyClassModel classModel, 
                                                                             Dictionary<Int64, RDFOntologyClass> visitContext) {
            var result        = new RDFOntologyClassModel();

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

            // Transitivity of "owl:equivalentClass" taxonomy: ((A EQUIVALENTCLASSOF B)  &&  (B EQUIVALENTCLASS C))  =>  (A EQUIVALENTCLASS C)
            foreach (var      ec in classModel.Relations.EquivalentClass.SelectEntriesBySubject(ontClass)) {
                result.AddClass((RDFOntologyClass)ec.TaxonomyObject);
                result        = result.UnionWith(RDFSemanticsUtilities.EnlistEquivalentClassesOf_Core((RDFOntologyClass)ec.TaxonomyObject, classModel, visitContext));
            }

            return result;
        }
 /// <summary>
 /// Enlists the disjointClasses with the given class within the given class model
 /// </summary>
 public   static RDFOntologyClassModel EnlistDisjointClassesWith(RDFOntologyClass ontClass, RDFOntologyClassModel classModel) {
     var result     = new RDFOntologyClassModel();
     if (ontClass  != null && classModel != null) {
         result     = RDFSemanticsUtilities.EnlistDisjointClassesWith_Core(ontClass, classModel, null).RemoveClass(ontClass);
     }
     return result;
 }
 /// <summary>
 /// Checks if the given ontology class is range of the given ontology property within the given ontology class model
 /// </summary>
 public static Boolean IsRangeClassOf(RDFOntologyClass rangeClass,
                                      RDFOntologyProperty ontProperty,
                                      RDFOntologyClassModel classModel)
 {
     return(rangeClass != null && ontProperty != null && classModel != null ? EnlistRangeClassesOf(ontProperty, classModel).Classes.ContainsKey(rangeClass.PatternMemberID) : false);
 }
 /// <summary>
 /// Checks if the given aclass can be set disjointwith the given bclass
 /// </summary>
 internal static bool CheckDisjointWithCompatibility(RDFOntologyClassModel classModel, RDFOntologyClass aClass, RDFOntologyClass bClass)
 => !classModel.CheckIsSubClassOf(aClass, bClass) &&
 !classModel.CheckIsSuperClassOf(aClass, bClass) &&
 !classModel.CheckIsEquivalentClassOf(aClass, bClass);
 /// <summary>
 /// Checks if the given aClass is disjointClass with the given bClass within the given class model
 /// </summary>
 public static Boolean IsDisjointClassWith(RDFOntologyClass aClass,
                                           RDFOntologyClass bClass,
                                           RDFOntologyClassModel classModel)
 {
     return(aClass != null && bClass != null && classModel != null ? EnlistDisjointClassesWith(aClass, classModel).Classes.ContainsKey(bClass.PatternMemberID) : false);
 }
        /// <summary>
        /// Validation rule checking for consistency of rdf:type axioms
        /// </summary>
        internal static void ClassType(RDFOntology ontology, RDFOntologyValidationReport report) {
            RDFSemanticsEvents.RaiseSemanticsInfo("Launched execution of validation rule 'ClassType'");
            
            #region Facts
            var disjWithCache       = new Dictionary<Int64, RDFOntologyClassModel>();
            var litCheckCache       = new Dictionary<Int64, Boolean>();
            foreach (var  fact     in ontology.Data) {
                var classTypes      = new RDFOntologyClassModel();
                foreach (var cType in ontology.Data.Relations.ClassType.SelectEntriesBySubject(fact)) {

                    //ClassTypes of a fact cannot be compatible with "rdfs:Literal"
                    var cTypeClass  = ontology.Model.ClassModel.SelectClass(cType.TaxonomyObject.ToString());
                    if (cTypeClass != null) {
                        if (!litCheckCache.ContainsKey(cTypeClass.PatternMemberID)) {
                             litCheckCache.Add(cTypeClass.PatternMemberID, RDFOntologyReasoningHelper.IsLiteralCompatibleClass(cTypeClass, ontology.Model.ClassModel));
                        }
                        if (litCheckCache[cTypeClass.PatternMemberID]) {
                            report.AddEvidence(new RDFOntologyValidationEvidence(
                                RDFSemanticsEnums.RDFOntologyValidationEvidenceCategory.Error,
                                "ClassType",
                                String.Format("Ontology fact '{0}' has a classtype '{1}' which is compatible with 'rdfs:Literal' and this cannot be possible.", fact, cTypeClass),
                                String.Format("Review classtypes of ontology fact '{0}'.", fact)
                            ));
                        }
                        else {
                            classTypes.AddClass(cTypeClass);
                        }
                    }

                }

                //ClassTypes of a fact cannot be disjoint
                foreach (var cType in classTypes) {
                    if  (!disjWithCache.ContainsKey(cType.PatternMemberID)) {
                          disjWithCache.Add(cType.PatternMemberID, RDFOntologyReasoningHelper.EnlistDisjointClassesWith(cType, ontology.Model.ClassModel));
                    }
                    foreach (var disjWithCType in disjWithCache[cType.PatternMemberID].IntersectWith(classTypes)) {
                        report.AddEvidence(new RDFOntologyValidationEvidence(
                            RDFSemanticsEnums.RDFOntologyValidationEvidenceCategory.Error,
                            "ClassType",
                            String.Format("Ontology fact '{0}' has both classtypes '{1}' and '{2}', which cannot be compatible because of an 'owl:disjointWith' constraint.", fact, cType, disjWithCType),
                            String.Format("Review classtypes of ontology fact '{0}'.", fact)
                        ));
                    }
                }

            }
            #endregion

            RDFSemanticsEvents.RaiseSemanticsInfo("Completed execution of validation rule 'ClassType'");
        }
 /// <summary>
 /// Checks if the given childclass can be set subclassof the given motherclass
 /// </summary>
 internal static bool CheckSubClassOfCompatibility(RDFOntologyClassModel classModel, RDFOntologyClass childClass, RDFOntologyClass motherClass)
 => !classModel.CheckIsSubClassOf(motherClass, childClass) &&
 !classModel.CheckIsEquivalentClassOf(motherClass, childClass) &&
 !classModel.CheckIsDisjointClassWith(motherClass, childClass);
 /// <summary>
 /// Checks if the given ontology class is range of the given ontology property within the given ontology class model
 /// </summary>
 public static Boolean IsRangeClassOf(RDFOntologyClass rangeClass, RDFOntologyProperty ontProperty, RDFOntologyClassModel classModel) {
     return (rangeClass != null && ontProperty != null && classModel != null ? RDFOntologyReasoningHelper.EnlistRangeClassesOf(ontProperty, classModel).Classes.ContainsKey(rangeClass.PatternMemberID) : false);
 }
Exemplo n.º 20
0
        internal static RDFOntologyClassModel EnlistSuperClassesOf_Core(RDFOntologyClass ontClass, RDFOntologyClassModel classModel) {
            var result1 = new RDFOntologyClassModel();
            var result2 = new RDFOntologyClassModel();

            // Step 1: Direct subsumption of "rdfs:subClassOf" taxonomy
            result1     = RDFSemanticsUtilities.EnlistSuperClassesOf(ontClass, classModel);

            // Step 2: Enlist equivalent classes of superclasses
            result2     = result2.UnionWith(result1);
            foreach(var sc in result1) {
                result2 = result2.UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(sc, classModel)
                                                .UnionWith(RDFOntologyReasoningHelper.EnlistSuperClassesOf(sc, classModel)));
            }

            return result2;
        }
 /// <summary>
 /// Enlists the range classes of the given property within the given ontology class model
 /// </summary>
 public static RDFOntologyClassModel EnlistRangeClassesOf(RDFOntologyProperty ontProperty, RDFOntologyClassModel classModel) {
     var result          = new RDFOntologyClassModel();
     if (ontProperty    != null && classModel != null) {
         if (ontProperty.Range  != null) {
             result      = RDFOntologyReasoningHelper.EnlistSubClassesOf(ontProperty.Range, classModel)
                              .UnionWith(RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(ontProperty.Range, classModel))
                              .AddClass(ontProperty.Range);
         }
     }
     return result;
 }
 /// <summary>
 /// Checks if the given aClass is equivalentClass of the given bClass within the given class model
 /// </summary>
 public static Boolean IsEquivalentClassOf(RDFOntologyClass aClass, RDFOntologyClass bClass, RDFOntologyClassModel classModel) {
     return(aClass != null && bClass != null && classModel != null ? RDFOntologyReasoningHelper.EnlistEquivalentClassesOf(aClass, classModel).Classes.ContainsKey(bClass.PatternMemberID) : false);
 }
 /// <summary>
 /// Checks if the given ontology class is compatible with 'rdfs:Literal' within the given class model
 /// </summary>
 public static Boolean IsLiteralCompatibleClass(RDFOntologyClass ontClass, RDFOntologyClassModel classModel) {
     var result    = false;
     if (ontClass != null && classModel != null) {
         result    = (ontClass.IsDataRangeClass()                                                                 ||
                      ontClass.Equals(RDFOntologyVocabulary.Classes.LITERAL)                                      ||
                      RDFOntologyReasoningHelper.IsSubClassOf(ontClass, RDFOntologyVocabulary.Classes.LITERAL, classModel) ||
                      RDFOntologyReasoningHelper.IsEquivalentClassOf(ontClass, RDFOntologyVocabulary.Classes.LITERAL, classModel));
     }
     return result;
 }