Esempio n. 1
0
        /// Build the hierachy of classes for the given class uri into the CModel stringbuilder.
        /// <summary>
        /// Build the hierachy of classes for the given class uri into the CModel stringbuilder.
        /// </summary>
        /// <returns></returns>
        private static void BuildClassesHierarchy(string classUri, ImageGenerator result, StringBuilder cModel, HashSet <string> duplicate, HashSet <string> classes, FrequentPattern <int> fp)
        {
            if ("http://www.w3.org/2002/07/owl#Thing".Equals(classUri))
            {
                return;
            }
            var set = fp.transactions.dataset.classesDepths[classUri];

            var closestSuperClass = set.OrderBy(x => x.Value).Select(x => x.Key).First();
            var cIL = fp.transactions.dataset.classes.ContainsKey(classUri) ?
                      fp.transactions.dataset.classes[classUri] :
                      new InstanceLabel(classUri, null, null);

            result.usedClassInstanceLabel.Add(cIL);
            var c = cIL.Label;


            if (fp.transactions.dataset.classesDepths.ContainsKey(classUri))
            {
                foreach (var superClass in fp.transactions.dataset.classesDepths[classUri].Keys)
                {
                    var scIL = fp.transactions.dataset.classes.ContainsKey(closestSuperClass) ?
                               fp.transactions.dataset.classes[closestSuperClass] :
                               new InstanceLabel(closestSuperClass, null, null);
                    result.usedClassInstanceLabel.Add(scIL);
                    var sc       = scIL.Label;
                    var strToAdd = sc + " <|-- " + c;
                    if (!duplicate.Contains(strToAdd))
                    {
                        cModel.AppendLine(strToAdd);
                        duplicate.Add(strToAdd);
                    }
                    if (!classes.Contains(scIL.Uri))
                    {
                        BuildClassesHierarchy(scIL.Uri, result, cModel, duplicate, classes, fp);
                    }
                }
            }
        }
Esempio n. 2
0
        // public string GetSuperClass(string classUri)
        // {
        //     if ("http://www.w3.org/2002/07/owl#Thing".Equals(classUri))
        //         return string.Empty;
        //     else if (!fp.transactions.dataset.classesDepths.ContainsKey(classUri))
        //         return string.Empty;
        //     else
        //     {
        //         var set = fp.transactions.dataset.classesDepths[classUri];
        //         var setOne = fp.transactions.dataset.classesDepths[classUri].Values;
        //         if (!set.Any()) return string.Empty;
        //         else
        //         {
        //             var closestSuperClass = set.OrderBy(x => x.Value).Select(x => x.Key).First();
        //             var cIL = fp.transactions.dataset.classes.ContainsKey(classUri) ?
        //                     fp.transactions.dataset.classes[classUri] :
        //                     new InstanceLabel(classUri, null, null);
        //             usedClassInstanceLabel.Add(cIL);
        //             var c = cIL.Label;
        //             var scIL = fp.transactions.dataset.classes.ContainsKey(closestSuperClass) ?
        //                 fp.transactions.dataset.classes[closestSuperClass] :
        //                 new InstanceLabel(closestSuperClass, null, null);
        //             usedClassInstanceLabel.Add(scIL);
        //             var sc = scIL.Label;
        //             return sc + " <|-- " + c;
        //         }
        //     }
        // }



        public static List <ImageGenerator> GenerateTxtForUml(Dataset ds,
                                                              InstanceLabel instanceClass, double threshold,
                                                              FrequentPattern <int> fp, ServiceProvider serviceProvider, string plantUmlJarPath, string localGraphvizDotPath,
                                                              IEnumerable <PatternDiscovery.ItemSet <int> > mfps)
        {
            var thresholdInt = Convert.ToInt32(threshold * 100);
            var maximalSets  = //fp.fis.Where(x => x.IsMaximal)
                               mfps.OrderByDescending(x => x.Count)
                               .ThenByDescending(x => x.TransactionCount).ToList();
            var finalResults = new List <ImageGenerator>();

            foreach (var mfp in maximalSets)
            {
                var result = new ImageGenerator();
                result.log                  = serviceProvider.GetService <ILogger <ImageGenerator> >();
                result.fp                   = fp;
                result.plantUmlJarPath      = plantUmlJarPath;
                result.localGraphvizDotPath = localGraphvizDotPath;
                finalResults.Add(result);
                var cModel = new StringBuilder();

                cModel.AppendLine("@startuml");
                cModel.AppendLine("skinparam linetype ortho");
                var duplicate = new HashSet <string>();

                // var propertySupport = Convert.ToInt32(mfp.Support * 100);
                var usedProp = new HashSet <int>();
                result.usedPropInstanceLabel  = new HashSet <InstanceLabel>();
                result.usedClassInstanceLabel = new HashSet <InstanceLabel>();
                var classes = new HashSet <string>();
                // first loop for object properties
                foreach (var id in mfp)
                {
                    var property = fp.transactions.intToPredicateDict[id];
                    if (fp.transactions.dataset.objectProperties.ContainsKey(property))
                    {
                        var pIL = fp.transactions.dataset.properties.ContainsKey(property) ?
                                  fp.transactions.dataset.properties[property] :
                                  new InstanceLabel(property, null, null);
                        result.usedPropInstanceLabel.Add(pIL);
                        var p = pIL.Label;
                        var domainAndRange = fp.transactions.dataset.objectProperties[property];
                        var dash           = domainAndRange.dash;
                        var domain         = domainAndRange.domain;
                        var dIL            = fp.transactions.dataset.classes.ContainsKey(domain) ?
                                             fp.transactions.dataset.classes[domain] :
                                             new InstanceLabel(domain, null, null);
                        result.usedClassInstanceLabel.Add(dIL);
                        var d     = dIL.Label;
                        var range = domainAndRange.range;
                        if (domain.Equals(range))
                        {
                            continue;
                        }
                        var rIL = fp.transactions.dataset.classes.ContainsKey(range) ?
                                  fp.transactions.dataset.classes[range] :
                                  new InstanceLabel(range, null, null);
                        result.usedClassInstanceLabel.Add(rIL);
                        var    r = rIL.Label;
                        string strToAdd;
                        var    propertySupport = fp.fis.Where(x => x.Count == 1 && x.Contains(id)).Select(x => Convert.ToInt32(x.Support * 100d).ToString()).FirstOrDefault();
                        if (dash)
                        {
                            strToAdd = d + " .. " + r + " : " + p + " sup:" + propertySupport;
                        }
                        else
                        {
                            strToAdd = d + " -- " + r + " : " + p + " sup:" + propertySupport;
                        }
                        if (!duplicate.Contains(strToAdd))
                        {
                            cModel.AppendLine(strToAdd);
                            duplicate.Add(strToAdd);
                        }
                        usedProp.Add(id);
                        classes.Add(domain);
                        classes.Add(range);
                    }
                }
                cModel.AppendLine("class " + instanceClass.Label + "{");
                // second loop for datatype properties
                foreach (var id in mfp)
                {
                    var property = fp.transactions.intToPredicateDict[id];
                    if (fp.transactions.dataset.dataTypeProperties.ContainsKey(property))
                    {
                        var pIL = fp.transactions.dataset.properties.ContainsKey(property) ?
                                  fp.transactions.dataset.properties[property] :
                                  new InstanceLabel(property, null, null);
                        result.usedPropInstanceLabel.Add(pIL);
                        var p               = pIL.Label;
                        var datatype        = fp.transactions.dataset.dataTypeProperties.GetValueOrDefault(property);
                        var r               = datatype.GetUriFragment();
                        var propertySupport = fp.fis.Where(x => x.Count == 1 && x.Contains(id)).Select(x => Convert.ToInt32(x.Support * 100d).ToString()).FirstOrDefault();
                        var strToAdd        = p + ":" + r + " sup=" + propertySupport;
                        if (!duplicate.Contains(strToAdd))
                        {
                            cModel.AppendLine(strToAdd);
                            duplicate.Add(strToAdd);
                        }
                        usedProp.Add(id);
                    }
                }
                // third loop for properties without info
                foreach (var id in mfp.Except(usedProp))
                {
                    var property = fp.transactions.intToPredicateDict[id];
                    var pIL      = fp.transactions.dataset.properties.ContainsKey(property) ?
                                   fp.transactions.dataset.properties[property] :
                                   new InstanceLabel(property, null, null);
                    result.usedPropInstanceLabel.Add(pIL);
                    var p = pIL.Label;
                    var propertySupport = fp.fis.Where(x => x.Count == 1 && x.Contains(id)).Select(x => Convert.ToInt32(x.Support * 100d).ToString()).FirstOrDefault();
                    var strToAdd        = p + " sup=" + propertySupport;
                    if (!duplicate.Contains(strToAdd))
                    {
                        cModel.AppendLine(strToAdd);
                        duplicate.Add(strToAdd);
                    }
                }
                cModel.AppendLine("}");
                // loop for current class hierarchy
                foreach (var line in result.GetAllSuperClasses(instanceClass.Uri))
                {
                    if (!string.IsNullOrWhiteSpace(line) && !duplicate.Contains(line))
                    {
                        cModel.AppendLine(line);
                        duplicate.Add(line);
                    }
                }
                // loop for related classes hierarchy
                foreach (var classUri in classes)
                {
                    BuildClassesHierarchy(classUri, result, cModel, duplicate, classes, fp);
                    // var set = fp.transactions.dataset.classesDepths[classUri];

                    // var closestSuperClass = set.OrderBy(x => x.Value).Select(x => x.Key).First();
                    // var cIL = fp.transactions.dataset.classes.ContainsKey(classUri) ?
                    //         fp.transactions.dataset.classes[classUri] :
                    //         new InstanceLabel(classUri, null, null);
                    // result.usedClassInstanceLabel.Add(cIL);
                    // var c = cIL.Label;


                    // if (fp.transactions.dataset.classesDepths.ContainsKey(classUri))
                    // {
                    //     foreach (var superClass in fp.transactions.dataset.classesDepths[classUri].Keys)
                    //     {
                    //         var scIL = fp.transactions.dataset.classes.ContainsKey(closestSuperClass) ?
                    //     fp.transactions.dataset.classes[closestSuperClass] :
                    //     new InstanceLabel(closestSuperClass, null, null);
                    //         result.usedClassInstanceLabel.Add(scIL);
                    //         var sc = scIL.Label;
                    //         var strToAdd = sc + " <|-- " + c;
                    //         if (!duplicate.Contains(strToAdd))
                    //         {
                    //             cModel.AppendLine(strToAdd);
                    //             duplicate.Add(strToAdd);
                    //         }
                    //     }
                    // }



                    //var cIL = fp.transactions.dataset.classes.ContainsKey(classUri) ?
                    //    fp.transactions.dataset.classes[classUri] :
                    //    new InstanceLabel(classUri, null, null);
                    //result.usedClassInstanceLabel.Add(cIL);
                    //var c = cIL.Label;
                    //if (fp.transactions.dataset.classesDepths.ContainsKey(classUri))
                    //{
                    //   foreach (var superClass in fp.transactions.dataset.classesDepths[classUri].Keys)
                    //   {
                    //       var scIL = fp.transactions.dataset.classes.ContainsKey(superClass) ?
                    //           fp.transactions.dataset.classes[superClass] :
                    //            new InstanceLabel(superClass, null, null);
                    //       result.usedClassInstanceLabel.Add(scIL);
                    //       var sc = scIL.Label;
                    //       var strToAdd = sc + " <|-- " + c;
                    //       if (!duplicate.Contains(strToAdd))
                    //        {
                    //            cModel.AppendLine(strToAdd);
                    //            duplicate.Add(strToAdd);
                    //        }
                    //    }
                    //}
                }
                cModel.AppendLine("@enduml");
                result.contentForUml = cModel.ToString();
            }
            return(finalResults);
        }