/// <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 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); }