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