/// <summary> /// Поиск одного слова /// </summary> /// <param name="unnamedNodeToSearch">Неименованная вершина, соответствующая слову из запроса</param> /// <param name="executeSimilarQuery"></param> /// <returns></returns> public static WordResult SearchOneWord(Node unnamedNodeToSearch, Action <string> executeSimilarQuery, WorkMemory workMemory) { var word = SemanticWeb.Web().GetNameForUnnamedNode(unnamedNodeToSearch, false); Node namedNodeToSearch = SemanticWeb.Web().FindNode(word); //определяем имя дуги, которой самый старший предок связан с #System workMemory.WorkedNodes.Add(namedNodeToSearch); workMemory.WorkedNodes.AddRange(SemanticWeb.Web().WayToSystemNodes); //Для метазнаний выполняем поиск по метазнаниям if (SemanticWeb.Web().OldestParentArc(unnamedNodeToSearch.ID) == "#MetaObjects") { return(MetadataSearch.SearchMetaData(unnamedNodeToSearch, word, executeSimilarQuery)); } //Если самая верхняя дуга имеет имя из метаобъектов, ищем слово из предметной области if ( SemanticWeb.Web() .GetAllMetaObjectNames() .Contains(SemanticWeb.Web().OldestParentArc(unnamedNodeToSearch.ID))) { return(ObjectSearcher.SearchObjectData(unnamedNodeToSearch, word, SemanticWeb.Web().OldestParentArc(unnamedNodeToSearch.ID), executeSimilarQuery)); } //throw new ArgumentException(SemanticWeb.ErrMsg + " Слово " + word + " не нашлось"); return(null); }
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); }