コード例 #1
0
        private IEnumerable <Node> GetMainObjAttrNamesType2()
        {
            List <string> mainObjs = SemanticWeb.Web().GetMainMetaObjectNames();

            string name = string.Empty;

            for (int i = 0; i < _query.Count && name == string.Empty; i++)
            {
                if (mainObjs.Contains(SemanticWeb.Web().OldestParentArc(_query.ElementAt(i).Value.ID)))
                {
                    name = _query.ElementAt(i).Key;
                }
            }
            string metaName     = SemanticWeb.Web().OldestParentArc(SafelyGetNodeByName(name, null).ID);
            var    mainObjAttrs = MetadataSearch.GetAttrList(SafelyGetNodeByName(metaName, null), metaName);

            return
                (_query.Values.Where(
                     (t, i) =>
                     mainObjAttrs.Contains(SemanticWeb.Web().OldestParentArc(_query.ElementAt(i).Value.ID)) &&
                     SemanticWeb.Web().GetNameForUnnamedNode(t, false) != name).ToList());
        }
コード例 #2
0
ファイル: Searcher.cs プロジェクト: ironyirina/Semantic-Bar
        public Searcher(string input, Action <string> executeSimilarQuery, bool searchSynonyms, bool searchClasses)
        {
            WorkMemory           = new WorkMemory();
            _executeSimilarQuery = executeSimilarQuery;
            _searchSynonyms      = searchSynonyms;
            _searchClasses       = searchClasses;
            _input = input;
            var cw = new ConceptWorker(SemanticWeb.Web().Nodes.Max(x => x.Name.Length), _searchSynonyms);

            cw.FindAll(_input, null);
            _inputParts = cw.Concepts.Where(x => x.IsRecognized).Select(x => x.Name).ToList();

            _nodesInQuery = GetNodesFromQuery();
            WorkMemory.WorkedNodes.AddRange(_nodesInQuery);
            _unnamedNodesInQuery = GetUnnamedNodesFromQuery();
            foreach (var unnamedNodesList in _unnamedNodesInQuery)
            {
                WorkMemory.WorkedNodes.AddRange(unnamedNodesList);
            }

            for (int i = 0; i < _nodesInQuery.Count; i++)
            {
                var node      = _nodesInQuery[i];
                var i1        = i;
                var uNodeList = _unnamedNodesInQuery.Where(x => x.Count > i1).Select(x => x[i1]);
                foreach (var uNode in uNodeList)
                {
                    Node node1 = uNode;
                    WorkMemory.WorkedArcs.AddRange(SemanticWeb.Web().Arcs.Where(x => x.From == node1.ID && x.Name == "#Name" &&
                                                                                x.To == node.ID));
                }
            }

            _unnamedSearcher = new List <UnnamedSearcher>();
            foreach (var unnanedNodesList in _unnamedNodesInQuery)
            {
                _unnamedSearcher.Add(new UnnamedSearcher(_input, _executeSimilarQuery, WorkMemory, _searchClasses, unnanedNodesList));
            }
        }
コード例 #3
0
ファイル: Loader.cs プロジェクト: ironyirina/Semantic-Bar
        private void Ananyze(string concept)
        {
            _sendReport("Слово " + concept);
            var unnamedNode = SemanticWeb.Web().GetUnnamedNodesForName(concept);
            var type        = SemanticWeb.Web().OldestParentArc(unnamedNode.ID);

            _sendReport("Это " + type);
            if (type == "#MetaObjects")
            {
                //надо добавить проверку атрибута
                _currentArcName = concept;
                return;
            }
            try
            {
                if (IsComplex(type))
                {
                    //в нашем случае Действия
                    //создаём неименованную вершину (_complexEntity)
                    _complexEntity = SemanticWeb.Web().AddNode("");
                    //проводим дугу _currentArcName (Действия) от _entityNode к _complexEntity
                    SemanticWeb.Web().AddArc(_entityNode.ID, _currentArcName, _complexEntity.ID);
                    //проводим дугу #is_instance от _complexEntity к unnamedNode (Соответствующее действие)
                    SemanticWeb.Web().AddArc(_complexEntity.ID, "#is_instance", unnamedNode.ID);
                }
                else
                {
                    //в нашем случае Ингредиенты, ёмкость, инструмент
                    //Проводим дугу с именем _currentArcName (Ингредиенты) от _entityNode к unnamedNode
                    SemanticWeb.Web().AddArc(_complexEntity == null ? _entityNode.ID : _complexEntity.ID, type, unnamedNode.ID);
                }
                _sendReport("Знания о концепте успешно добавлены");
            }
            catch (Exception e)
            {
                _sendReport("Ошибка! " + e.Message);
            }
        }
コード例 #4
0
ファイル: Searcher.cs プロジェクト: ironyirina/Semantic-Bar
        public QueryResult Search()
        {
            if (_unnamedSearcher.Count == 0)
            {
                return new QueryResult {
                           Message = "Поиск не дал результатов"
                }
            }
            ;
            if (_unnamedSearcher.Count == 1)
            {
                return(_unnamedSearcher[0].Search());
            }
            var res = new QueryResult {
                Message = "Волею Хаоса сему понятию дана неоднозначность"
            };

            for (int i = 0; i < _unnamedSearcher.Count; i++)
            {
                var    unnamedSearcher = _unnamedSearcher[i];
                var    qr = unnamedSearcher.Search();
                string s  = " для ";
                for (int j = 0; j < _unnamedNodesInQuery[i].Count; j++)
                {
                    var type = SemanticWeb.Web().GetClosestParentName(_unnamedNodesInQuery[i][j]);
                    s += " " + _nodesInQuery[j].Name + " ";
                    if (type != "#MetaObjects")
                    {
                        s += " (" + type + ") ";
                    }
                    s += "+";
                }
                qr.Message += s.Substring(0, s.Length - 1);
                res.PolysemanticResult.Add(qr);
            }
            return(res);
        }
    }
コード例 #5
0
        private bool IsConcreteMainObjWithAttr()
        {
            List <string> mainObjs     = SemanticWeb.Web().GetMainMetaObjectNames();
            var           mainObjNames = new List <string>();

            foreach (var mainObj in mainObjs)
            {
                mainObjNames.AddRange(SemanticWeb.Web().GetAllAttr(
                                          SemanticWeb.Web().Mota(SemanticWeb.Web().Atom("#System")).ID,
                                          mainObj).Select(x => SemanticWeb.Web().GetNameForUnnamedNode(x, false)).ToList());
            }

            bool queryContainsMainObject = _query.Keys.Count(mainObjNames.Contains) == 1;

            if (!queryContainsMainObject)
            {
                return(false);
            }

            string name         = SemanticWeb.Web().OldestParentArc(SafelyGetNodeByName(_query.Keys.Single(mainObjNames.Contains), null).ID);
            var    mainObjAttrs = MetadataSearch.GetAttrList(SafelyGetNodeByName(name, "#MetaObjects"), name);

            int attrCount = 0;

            foreach (string x in mainObjAttrs)
            {
                for (int i = 0; i < _query.Count; i++)
                {
                    if (SemanticWeb.Web().OldestParentArc(_query.ElementAt(i).Value.ID) == x)
                    {
                        attrCount++;
                        break;
                    }
                }
            }
            return(attrCount >= 2);
        }
コード例 #6
0
        /// <summary>
        /// Изменение имени дуги
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DdLinkTextEditing(object sender, LinkValidationEventArgs e)
        {
            if (!CanEdit)
            {
                e.Cancel = true;
                return;
            }
            Messages.Add("Изменение типа дуги: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
            var formLink = new ComboBoxForm();
            var listarc  = SemanticWeb.Web().GetAllowedArcNames(((Node)e.Link.Origin.Tag).ID);

            formLink.RefreshValue(listarc);
            formLink.ShowDialog();
            try
            {
                if (formLink.DialogResult == true)
                {
                    string newT = formLink.ReturnValue().ToString(); //новое имя вершины выбранное из комбобоксика
                    SemanticWeb.Web().ChangeArcName(((Node)e.Link.Origin.Tag).ID, e.Link.Text, newT, ((Node)e.Destination.Tag).ID);
                    e.Link.Text = newT;
                    Messages.Add("Изменение дуги завершилось: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
                }
                else
                {
                    Messages.Add("Отмена изменения типа дуги: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
                    e.Cancel = true;
                }
            }
            catch (ArgumentException e1)
            {
                Messages.Add("Отмена изменения типа дуги с ошибкой: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
                MessageBox.Show(e1.Message);
                e.Cancel = true;
            }
            formLink.Close();
            e.Cancel = true;
        }
コード例 #7
0
        /// <summary>
        /// Изменение имени вершины
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void DdNodeTextEditing(object sender, NodeValidationEventArgs e)
        {
            if (!CanEdit)
            {
                e.Cancel = true;
                return;
            }
            if (((Node)e.Node.Tag).IsSystem)
            {
                e.Cancel = true;
            }

            var formName = new TextBoxForm(e.Node.Text);

            formName.ShowDialog();
            try
            {
                if (formName.DialogResult == true)
                {
                    string newName = formName.ReturnValue(); //новое имя вершины
                    /*УЖАСНЫЙ КОСЯК ИЗМЕНЕНИЕ СЕТИ Д.Б. ЗДЕСЬ, А НЕ В КОНЦЕ*/
                    e.Node.Text = newName;
                    Messages.Add("Изменение имени вершины на " + e.Node.Text + "  завершилось");
                    SemanticWeb.Web().ChangeNodeName(((Node)e.Node.Tag).ID, newName);
                }
                else
                {
                    Messages.Add("отмена изменения имени вершины " + e.Node.Text);
                }
            }
            catch (ArgumentException e1)
            {
                Messages.Add("отмена изменения имени вершины: " + e1.Message);
            }
            formName.Close();
            e.Cancel = true;
        }
コード例 #8
0
        //Тип запроса 2 (ConcreteMainObject + ConcreteMainObject.Attribute)

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

        private bool Type2Execute(string mainName, IEnumerable <Node> attNodes)
        {
            var metaName = SemanticWeb.Web().OldestParentArc(SafelyGetNodeByName(mainName, null).ID); //тип mainName
            //список атрибутов для metaName
            string res           = null;
            var    childrenNames = new List <string>();

            foreach (var attrNode in attNodes)
            {
                var attrs =
                    MetadataSearch.ToListWithHeader(
                        MetadataSearch.AddAttribute(SafelyGetNodeByName(metaName, null), metaName));
                var instanceNode = SafelyGetNodeByName(mainName, SemanticWeb.Web().GetMainMetaObjectNames()[0]);

                childrenNames = MetadataSearch.ToListWithHeader(MetadataSearch.AddInstances(attrNode, false));

                List <Node> children = childrenNames
                                       .Select(x => SafelyGetNodeByName(x, SemanticWeb.Web().GetNameForUnnamedNode(attrNode, false))).
                                       ToList();

                res = null;
                for (int i = 0; i < children.Count && res == null; i++)
                {
                    res = GetAttrNameIfExists(instanceNode, attrNode, attrs);
                }
            }

            if (res != null)
            {
                if (childrenNames.Contains(res))
                {
                    return(true);
                }
            }
            return(false);
        }
コード例 #9
0
 /// <summary>
 /// Изменение дуги
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void DdLinkModified(object sender, LinkEventArgs e)
 {
     if (!Load)
     {
         return;
     }
     if (!CanEdit)
     {
         return;
     }
     Messages.Add("изменение дуги: " + _oldLink.Text + " от " + _oldLink.Origin.Text + " к " + _oldLink.Destination.Text);
     try
     {
         if (_oldLink.Origin.Text != e.Link.Origin.Text)
         {
             SemanticWeb.Web().ChangeArcDirectionFrom(((Node)_oldLink.Origin.Tag).ID, ((Node)e.Link.Origin.Tag).ID, e.Link.Text, ((Node)e.Link.Destination.Tag).ID);
             Messages.Add("изменение дуги заврешено: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
         }
         if (_oldLink.Destination.Text != e.Link.Destination.Text)
         {
             SemanticWeb.Web().ChangeArcDirectionFrom(((Node)_oldLink.Origin.Tag).ID, ((Node)e.Link.Origin.Tag).ID, e.Link.Text, ((Node)e.Link.Destination.Tag).ID);
             Messages.Add("изменение дуги заврешено: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
         }
     }
     catch (ArgumentException e1)
     {
         e.Link.Text        = _oldLink.Text;
         e.Link.Origin      = _oldLink.Origin;
         e.Link.Destination = _oldLink.Destination;
         MessageBox.Show(e1.Message);
         Messages.Add("изменение дуги отменено: " + _oldLink.Text + " от " + _oldLink.Origin.Text + " к " + _oldLink.Destination.Text);
     }
     catch (NullReferenceException e2)
     {
     }
 }
コード例 #10
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);
        }
コード例 #11
0
        /// <summary>
        /// Добавляет в рабочую память те вершины и дуги, которые есть по пути от вершины from к вершине to.
        /// Вершина to обязательно должна быть достижими по дуга arcNames из from
        /// </summary>
        /// <param name="from">Откуда идём</param>
        /// <param name="to">Куда идём</param>
        /// <param name="arcNames">По каким дугам идём</param>
        private void AddWayToWorkMemory(Node from, Node to, List <string> arcNames)
        {
            var reachedNodes = Reached(from, arcNames);

            if (!reachedNodes.Contains(to))
            {
                throw new ArgumentException(string.Format("Вершина {0} не достижима из {1} по arcNames", from, to));
            }
            var way = FindAWay(from, to, arcNames);

            if (way == null)
            {
                return;
            }
            var nodesFromWay =
                way.ToList().Select(x => x.From).Union(way.ToList().Select(x => x.To)).Distinct().Select(x => SemanticWeb.Web().Mota(x));

            _workMemory.WorkedArcs.AddRange(way);
            _workMemory.WorkedNodes.AddRange(nodesFromWay);
        }
コード例 #12
0
        private string GetMainObjNameType1()
        {
            List <string> mainObjs = SemanticWeb.Web().GetMainMetaObjectNames();

            return(_query.Keys.Single(mainObjs.Contains));
        }
コード例 #13
0
ファイル: Loader.cs プロジェクト: ironyirina/Semantic-Bar
        private bool IsComplex(string word)
        {
            var unnamedNode = SemanticWeb.Web().GetUnnamedNodesForName(word);

            return(SemanticWeb.Web().GetAllAttr(unnamedNode.ID, "#HasAttribute").Count != 0);
        }
コード例 #14
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);
        }
コード例 #15
0
        private void AddSynonym()
        {
            var parentNamedNode = SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(((TreeViewItem)twIsA.SelectedItem).Header.ToString()));

            parentNamedNode.AddSynonym(tbName.Text);
        }