// 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); }
/// <summary> /// Get transactions from given dataset about instances of given class. /// </summary> /// <param name="dataset"></param> /// <returns></returns> public static async Task <TransactionList <T> > GetTransactions(Dataset dataset, InstanceLabel instanceClass) { var result = new TransactionList <T>(); if (!dataset.IsOpen) { await dataset.LoadHdt(); } var instances = await dataset.GetInstances(instanceClass); result.instanceClass = instanceClass; var predicateToIntDict = new ConcurrentDictionary <string, T>(); var intToPredicateDict = new ConcurrentDictionary <T, string>(); var bag = new ConcurrentBag <Transaction <T> >(); result.dataset = dataset; int instanceNumber = 0; // foreach (var instance in instances) var degreeOfParallelism = 70; #if DEBUG degreeOfParallelism = 4; #endif instances.AsParallel().WithDegreeOfParallelism(degreeOfParallelism).ForAll(instance => { instanceNumber++; var predicates = dataset.GetPredicates(instance).Result; // transaction of the given instance var currentTransaction = new HashSet <T>(); var hasType = false; foreach (var predicate in predicates) { T predicateId; if (predicateToIntDict.ContainsKey(predicate)) { predicateId = predicateToIntDict[predicate]; if (predicate.Contains("type")) { hasType = true; } } else { // FIXME: following line works only if T is of a number type... Thus, it's not real generic class... predicateId = (T)Convert.ChangeType(predicateToIntDict.Count + 1, typeof(T)); var addition1 = predicateToIntDict.TryAdd(predicate, predicateId); //[predicate] = predicateId; var addition2 = intToPredicateDict.TryAdd(predicateId, predicate); // [predicateId] = predicate; if (predicate.Contains("type")) { hasType = true; } } currentTransaction.Add(predicateId); } if (!hasType) { Console.WriteLine(instance + " " + instanceNumber); } bag.Add(new Transaction <T>(currentTransaction.ToArray())); } ); result.predicateToIntDict = predicateToIntDict.ToDictionary(x => x.Key, x => x.Value); result.intToPredicateDict = intToPredicateDict.ToDictionary(x => x.Key, x => x.Value); result.transactions = bag.ToList(); result.domain = result.intToPredicateDict.Select(x => x.Key).ToList(); return(result); }