Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }