/// <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);
        }
示例#2
0
        public QueryResult Search()
        {
            var queryResult = new QueryResult {
                Query = _input, ExecuteSimilarQuery = _executeSimilarQuery
            };

            if (_query.Count == 0)
            {
                //если в сем сети нет ни одной вершины, имя которой совпадает со словом из запроса
                queryResult.Message = "Поиск не дал результатов.";
            }
            else
            {
                foreach (var node in _query.Values)
                {
                    var name = SemanticWeb.Web().GetNameForUnnamedNode(node, true);
                    var arc  = SemanticWeb.Web().OldestParentArc(node.ID);
                    _workMemory.WorkedNodes.AddRange(SemanticWeb.Web().WayToSystemNodes);
                    _workMemory.WorkedArcs.AddRange(SemanticWeb.Web().WayToSystemArcs);
                }
                //Тип запроса 1 (MainObjWithAttrs):
                //MainObject + ConcreteMainObject.Attribute { + ConcreteMainObject.Attribute }

                /*Например:
                * Коктейль с соком
                * Коктейль, где используется Бокал
                * Коктейль с соком в бокале
                * и т.д. */

                #region Тип 1

                if (IsMainObjWithAttrs())
                {
                    //Комменты будут на конкретном примере, иначе нифига не понятно
                    //Пример: "Коктейль с вишенкой"
                    //Ищем список всех атрибутов Главного Метаобъекта, перечисленных в запросе. В данном случае - {"Вишня"}
                    var attrsType1 = GetMainObjAttrNamesType1().ToList();
                    var parents    = new List <string>();
                    if (attrsType1.Count > 0)
                    {
                        queryResult.JointResult = MainObjWithAttrsExecute(GetMainObjNameType1(), attrsType1[0]);
                    }
                    for (int i = 1; i < attrsType1.Count; i++)
                    {
                        queryResult.JointResult = queryResult.JointResult
                                                  .Intersect(MainObjWithAttrsExecute(GetMainObjNameType1(), attrsType1[i])).ToList();
                    }
                    if (queryResult.JointResult.Count == 0)
                    {
                        queryResult.Message = "Поиск не дал результатов";
                    }
                    if (_searchClasses)
                    {
                        foreach (var attr in attrsType1)
                        {
                            parents.AddRange(
                                ObjectSearcher.FindParents(attr).Where(x => x != attr.Name));
                        }
                        queryResult.GeneralResult =
                            parents.Select(x => GetMainObjNameType1() + ", где используется " + x).ToList();
                    }
                }
                #endregion

                //Тип запроса 2 (ConcreteMainObject + ConcreteMainObject.Attribute)

                /* Например: есть ли в French75 вишня?
                 * используется ли в WinterChill бокал?
                 */

                #region Тип 2

                else if (IsConcreteMainObjWithAttr())
                {
                    queryResult.Message = Type2Execute(GetMainObjNameType2(), GetMainObjAttrNamesType2()) ? "Да" : "Нет";
                }
                #endregion

                //Для всех остальных запросов просто ищем каждое слово по отдельности
                else
                {
                    foreach (Node node in _query.Values)
                    {
                        //ищем каждое слово по отдельности
                        var wordRes = OneWordSearcher.SearchOneWord(node, _executeSimilarQuery, _workMemory);
                        if (wordRes != null)
                        {
                            queryResult.EveryWordResult.Add(wordRes);
                        }
                    }
                }
            }
            return(queryResult);
        }