/// <summary> /// Поиск по метазнаниям /// </summary> /// <param name="unnamedNodeToSearch"></param> /// <param name="word"></param> /// <param name="executeSimilarQuery"></param> /// <returns></returns> public static MetaResult SearchMetaData(Node unnamedNodeToSearch, string word, Action <string> executeSimilarQuery) { var metaResult = new MetaResult { Name = word, //Добавляем атрибуты Attributes = AddAttribute(unnamedNodeToSearch, word), //Добавляем понятия, где используется word Usages = AddUsages(unnamedNodeToSearch, word).Where(x => x != word).ToList(), //Добавляем экземпляры //Находим все дуги с именем WORD, выходящие из вершины SYSTEM Instances = AddInstancesOfMetaObject(word), ExecuteSimilarQuery = executeSimilarQuery }; return(metaResult); }
public static ObjectResult SearchObjectData(Node unnamedNodeToSearch, string word, string oldestArcName, Action <string> executeSimilarQuery) { var objectResult = new ObjectResult { Name = word, Type = oldestArcName, ExecuteSimilarQuery = executeSimilarQuery }; //список атрибутов из метазаний MetaResult metaInf = MetadataSearch.SearchMetaData(SemanticWeb.Web().GetUnnamedNodesForName(oldestArcName), oldestArcName, executeSimilarQuery); objectResult.InfFromMetadata.Header = metaInf.Attributes.Header + " " + word; List <string> attrNames = (from TreeViewItem aa in metaInf.Attributes.Items.SourceCollection select aa.Header.ToString()).ToList(); //WayToParent objectResult.WayToParent = FindParents(unnamedNodeToSearch); //InfFromFile if (attrNames.Contains("Файл")) { try { var sr = new StreamReader( SemanticWeb.Web().GetNameForUnnamedNode( SemanticWeb.Web().GetAttr(unnamedNodeToSearch.ID, "Файл"), false)); while (!sr.EndOfStream) { objectResult.InfFromFile.Add(sr.ReadLine()); } sr.Close(); } catch (Exception) { objectResult.InfFromFile.Add( "Файл с рецептом не найден. Вам придётся довольствоваться лишь знаниями из сети :("); } } //InfFromMetadata objectResult.InfFromMetadata = MetadataInf(unnamedNodeToSearch, word, oldestArcName, metaInf.Attributes); foreach (var parent in FindParentNodes(unnamedNodeToSearch)) { var parentMetadata = MetadataInf(parent, word, oldestArcName, metaInf.Attributes); } //SimilarQueries objectResult.SimilarQueries = SemanticWeb.Web().GetMainMetaObjectNames() .Where(x => x != oldestArcName) .Select(mainObj => mainObj + ", где используется " + word).ToList(); //если то, что мы ищем, является классом и имеет подклассы и экземпляры, то находим их все if (SemanticWeb.Web().GetNodesDirectedToMe(unnamedNodeToSearch.ID, "#is_a").Any() || SemanticWeb.Web().GetNodesDirectedToMe(unnamedNodeToSearch.ID, "#is_instance").Any()) { var classResult = new ClassResult(objectResult) { Instances = MetadataSearch.AddInstances(unnamedNodeToSearch, false) }; return(classResult); } //в противном случае возвращаем то, что уже нашли return(objectResult); }