예제 #1
0
        /// <summary>
        /// Возвращает имя вершины и имена всех её потомков
        /// </summary>
        /// <param name="unnamedNodeToSearch">Вершина, куда попадаем по дуге WORD из SYSTEM</param>
        /// <param name="onlyClasses"> </param>
        /// <returns></returns>
        public static TreeViewItem AddInstances(Node unnamedNodeToSearch, bool onlyClasses)
        {
            var name = SemanticWeb.Web().GetNameForUnnamedNode(unnamedNodeToSearch, false);

            if (string.IsNullOrEmpty(name))
            {
                return(null);
            }
            var instance = new TreeViewItem {
                Header = SemanticWeb.Web().GetNameForUnnamedNode(unnamedNodeToSearch, false)
            };
            var children = SemanticWeb.Web().GetNodesDirectedToMe(unnamedNodeToSearch.ID, "#is_a");

            if (!onlyClasses)
            {
                children =
                    children.Union(SemanticWeb.Web().GetNodesDirectedToMe(unnamedNodeToSearch.ID, "#is_instance")).
                    ToList();
            }
            foreach (var child in children)
            {
                var newInstance = AddInstances(child, onlyClasses);
                if (newInstance != null)
                {
                    instance.Items.Add(newInstance);
                }
            }
            return(instance);
        }
예제 #2
0
        /// <summary>
        /// Окно для создания или изменения дуги
        /// </summary>
        /// <param name="sw">Сем. сеть</param>
        /// <param name="title">Заголовок окна</param>
        /// <param name="changeType">тип: 0 - добавление, 1 - изм. from,
        /// 2 - изм. name, 3 - изм. to</param>
        /// <param name="fromID"> </param>
        /// <param name="arcName"> </param>
        /// <param name="toID"> </param>
        public AddChangeArc(SemanticWeb sw, string title, int changeType,
                            int fromID = 0, string arcName = "#MetaRelations", int toID = 0)
        {
            _sw = sw;
            InitializeComponent();

            cbFrom.ItemsSource = _sw.Nodes;

            cbTo.ItemsSource = _sw.Nodes;

            //if (cbFrom.Items.Count > 0) cbFrom.SelectedIndex = 0;
            //if (cbName.Items.Count > 0) cbName.SelectedIndex = 0;
            //if (cbTo.Items.Count > 0) cbTo.SelectedIndex = 0;

            Title = title;

            switch (changeType)
            {
            case 1:
                cbName.IsEnabled = false;
                cbTo.IsEnabled   = false;
                break;

            case 2:
                cbFrom.IsEnabled = false;
                cbTo.IsEnabled   = false;
                break;

            case 3:
                cbFrom.IsEnabled = false;
                cbName.IsEnabled = false;
                break;
            }
        }
예제 #3
0
        private bool AnalyzeFirst(string concept)
        {
            _sendReport("Слово " + concept);
            var unnamedNode = SemanticWeb.Web().GetUnnamedNodesForName(concept);
            var type        = SemanticWeb.Web().OldestParentArc(unnamedNode.ID);

            if (type != "#MetaObjects")
            {
                return(false);
            }
            try
            {
                //Неименованная вершина Коктейль (#1)
                _sendReport("Создаём неименованную вершину для концепта");
                _entityNode = SemanticWeb.Web().AddNode(string.Empty);
                _sendReport("Проводим дугу от вершины SYSTEM с именем " + concept + " к неименованной вершине");
                SemanticWeb.Web().AddArc(SemanticWeb.Web().Atom("#System"), concept, _entityNode.ID);
                //Неименованная вершина Файл (#2)
                _fileNode = SemanticWeb.Web().AddNode("");
                SemanticWeb.Web().AddArc(_entityNode.ID, "Файл", _fileNode.ID);
                //Вершина с именем файла (#3)
                _namedFileNode = SemanticWeb.Web().AddNode(_fileName);
                //(#2)-Name-(#3)
                SemanticWeb.Web().AddArc(_fileNode.ID, "#Name", _namedFileNode.ID);
                return(true);
            }
            catch (Exception e)
            {
                _sendReport("Ошибка! " + e.Message);
                return(false);
            }
        }
예제 #4
0
        private IEnumerable <string> Type1OneWord(string mainObj, Node attrNode)
        {
            //находим все экземпляры MainObject
            // Список всех коктейлей
            List <string> instancesNames = MetadataSearch.ToList(MetadataSearch.AddInstancesOfMetaObject(mainObj));
            // Список всех неименованных вершин - коктейлей
            var instances = instancesNames.Select(x => SafelyGetNodeByName(x, SemanticWeb.Web().GetMainMetaObjectNames()[0]));
            // Список всех атрибутов метаобъекта (Ингредиент, Ёмкость, Действие...)
            var attrs = MetadataSearch.ToListWithHeader(MetadataSearch.AddAttribute(SafelyGetNodeByName(mainObj, null), mainObj));
            //Вершина, соответствующая экземпляру атрибута, который ищем (например, неименованный узел для Вишни)
            var list = new List <string>();

            foreach (Node instanceNode in instances)
            {
                string res = GetAttrNameIfExists(instanceNode, attrNode, attrs);
                if (res != null)
                {
                    if (res == SemanticWeb.Web().GetNameForUnnamedNode(attrNode, false))
                    {
                        list.Add(SemanticWeb.Web().GetNameForUnnamedNode(instanceNode, false));
                    }
                    _workMemory.WorkedArcs.AddRange(SemanticWeb.Web().WayToSystemArcs);
                    _workMemory.WorkedNodes.AddRange(SemanticWeb.Web().WayToSystemNodes);
                }
            }
            return(list);
        }
예제 #5
0
        private Node SafelyGetNodeByName(string name, string desiredContext)
        {
            if (_query.ContainsKey(name))
            {
                return(_query[name]);
            }

            var nodes = SemanticWeb.Web().GetAllUnnamedNodesForName(name);

            if (nodes.Count == 1)
            {
                return(nodes[0]);
            }
            if (desiredContext == null)
            {
                throw new ArgumentException("What a f**k?!");
            }
            var res = nodes.FirstOrDefault(x => SemanticWeb.Web().GetClosestParentName(x) == desiredContext);

            if (res != null)
            {
                return(res);
            }
            throw new ArgumentException("What a f**k?!");
        }
예제 #6
0
        private List <Node> Reached(Node fromNode, List <string> arcNames)
        {
            var res = new List <Node> {
                fromNode
            };
            var reachedNodes = new List <Node>();

            if (!arcNames.Contains("#is_instance"))
            {
                arcNames.Add("#is_instance");
            }
            foreach (var arcName in arcNames)
            {
                reachedNodes.AddRange(SemanticWeb.Web().GetAllAttr(fromNode.ID, arcName));
            }
            var newNodes = reachedNodes.Where(x => !res.Contains(x));

            foreach (var newNode in newNodes)
            {
                var listx = Reached(newNode, arcNames);
                foreach (var node in listx.Where(x => !res.Contains(x)))
                {
                    res.Add(node);
                }
            }
            return(res);
        }
        private void AddWordForm()
        {
            var name            = (((TreeViewItem)twIsA.SelectedItem).Header.ToString());
            var parentNamedNode = SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(name));

            parentNamedNode.AddWordForm(name, tbName.Text);
        }
예제 #8
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);
        }
예제 #9
0
        public void PrintGraph(SemanticWeb web)
        {
            Load   = true;
            Reload = true;
            DD.ClearAll();
            var nodeMap = new Dictionary <int, DiagramNode>();

            foreach (var node in web.Nodes)
            {
                var bounds      = new Rect(new Point(node.X, node.Y), new Point(node.X + NodeWidth, node.Y + NodeHeight));
                var diagramNode = DD.Factory.CreateShapeNode(bounds);
                //diagramNode.Brush = new LinearGradientBrush(new GradientStopCollection
                nodeMap[node.ID] = diagramNode;
                diagramNode.Text = node.Name;
                diagramNode.Tag  = node;
            }
            foreach (var arc in web.Arcs)
            {
                var diagramArc =
                    DD.Factory.CreateDiagramLink(nodeMap[arc.From], nodeMap[arc.To]);
                diagramArc.Text = arc.Name;
                diagramArc.Tag  = true;
            }
            Load   = false;
            Reload = false;
        }
예제 #10
0
        private void SynEditOnClick(object sender, RoutedEventArgs routedEventArgs)
        {
            var w = new SynWindow(FileName, ((Node)_rightNode.Tag).Name);

            w.ShowDialog();
            PrintGraph(SemanticWeb.Web());
        }
예제 #11
0
 /// <summary>
 /// Удаление дуги
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void DdLinkDeleted(object sender, LinkEventArgs e)
 {
     if (Load)
     {
         return;
     }
     if (!CanEdit)
     {
         return;
     }
     // DD.Links.Remove()
     if (e.Link.Text != "")
     {
         if ((bool)e.Link.Tag)
         {
             if (!Load || !Reload)
             {
                 SemanticWeb.Web().DeleteArc(((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);
         // _somethingChanged = true;
     }
     // e.Link.Destination - цель
     // e.Link.Origin//откуда
 }
예제 #12
0
 /// <summary>
 /// Создание дуги
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void DdLinkCreated(object sender, LinkEventArgs e)
 {
     try
     {
         var formLink = new ComboBoxForm();
         formLink.RefreshValue(SemanticWeb.Web().GetAllowedArcNames(((Node)e.Link.Origin.Tag).ID));
         formLink.ShowDialog();
         Messages.Add("Создание дуги " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
         if (formLink.DialogResult == true)
         {
             e.Link.Text = formLink.ReturnValue().ToString();
             SemanticWeb.Web().AddArc(((Node)e.Link.Origin.Tag).ID, e.Link.Text, ((Node)e.Link.Destination.Tag).ID);
             e.Link.Tag = true;
             Messages.Add("Создание дуги завершилось: " + e.Link.Text + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
         }
         else
         {
             DD.Links.Remove(e.Link);
             Messages.Add("Создание дуги отменено: " + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
         }
     }
     catch (ArgumentException e1)
     {
         MessageBox.Show(e1.Message);
         /*произошла ошибка вставки, удаляем дугу из графа*/
         e.Link.Tag = false;
         DD.Links.Remove(e.Link);
         Messages.Add("Создание дуги отменено: " + " от " + e.Link.Origin.Text + " к " + e.Link.Destination.Text);
     }
 }
예제 #13
0
 public void SaveCoordinates()
 {
     foreach (DiagramNode t in DD.Nodes)
     {
         SemanticWeb.Web().ChangeNodeCoordinates(((Node)t.Tag).ID, t.Bounds.X, t.Bounds.Y);
     }
 }
예제 #14
0
        private IEnumerable <List <Node> > GetAuxiliaryUnnamedNodes()
        {
            /* Пример: Пусть шейкер - это инструмент и ёмкость, а апельсин - фрукт и сок.
             * Пусть есть соответствующие именованные вершины: {{Cocktail, 3}, {Shaker, 20}, {Orange, 15}}
             * И есть неименованные вершины, из которых выходят дуги Name:
             * {_, 2} --Name--> {Cocktail, 3}
             * {_, 19} --Name--> {Shaker, 20} // Ёмкость
             * {_, 21} --Name--> {Shaker, 20} // Инструмент
             * {_, 14} --Name--> {Orange, 15} // Фрукт
             * {_, 18} --Name--> {Orange, 15} // Сок
             * Тогда в результате запроса "Коктейль в шейкере с апельсином" будет сформирован список
             * _nodesInQuery = {{Cocktail, 3}, {Shaker, 20}, {Orange, 15}}
             * auxNodes = {{2}, {19, 21}, {14, 18}}
             * Далее из на основе этого списка будет получен список всех возможных значений, т.е. декартово произведение:
             * {{2, 19, 14}, {2, 21, 14}, {2, 19, 18}, {2, 21, 18}}.
             */
            var auxNodes = new List <List <Node> >();

            for (int i = 0; i < _nodesInQuery.Count; i++)
            {
                var namedNode = _nodesInQuery[i];
                auxNodes.Add(new List <Node>());
                auxNodes[i].AddRange(SemanticWeb.Web().GetAllUnnamedNodesForName(namedNode.Name));
            }
            return(auxNodes);
        }
예제 #15
0
        private bool IsMainObjWithAttrs()
        {
            if (_query.Count == 1)
            {
                return(false);
            }
            List <string> mainObjs = SemanticWeb.Web().GetMainMetaObjectNames(); //список всех mainObj системы
            bool          queryContainsMainObject = _query.Keys.Count(mainObjs.Contains) == 1;

            //правда ли, что в запросе есть 1 mainObj?
            if (!queryContainsMainObject)
            {
                return(false);                                   //если нет, то печаль
            }
            string name = _query.Keys.Single(mainObjs.Contains); //имя этого mainObj
            IEnumerable <string> mainObjAttrs = MetadataSearch.GetAttrList(SafelyGetNodeByName(name, "#MetaObject"), name);
            //список атрибутов mainObj
            int attrCount = 0;

            for (int i = 0; i < _query.Count; i++)
            {
                Node tmpNode  = _query.ElementAt(i).Value;
                var  objAttrs = mainObjAttrs as IList <string> ?? mainObjAttrs.ToList();
                if (objAttrs.Contains(SemanticWeb.Web().OldestParentArc(tmpNode.ID)))
                {
                    attrCount++;
                }
            }
            //mainObjAttrs.Count(x => _nodesInQuery.Any(t => _wordTypes[t.Name] == x));
            //количество этих атрибутов в запросе
            return(attrCount == _query.Count - 1); //если их больше 0, то успех
        }
예제 #16
0
 private void CancelCommandExecuted(object sender, ExecutedRoutedEventArgs e)
 {
     MyDiag.Reload = true; MyDiag.Load = true;
     SemanticWeb.ReadFromXml(FileName);
     MyDiag.PrintGraph(SemanticWeb.Web());
     MyDiag.Reload = false; MyDiag.Load = false;
     _messages.Add("изменения отменены");
 }
예제 #17
0
 /*отменить*/
 private void loadButton_Click(object sender, RoutedEventArgs e)
 {
     reload = true;
     myWeb  = SemanticWeb.ReadFromXml(path);
     PrintGraph(myViewWeb);
     reload = false;
     SendMessage("изменения отменены");
 }
예제 #18
0
        public void EditWithFormsExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            SaveExecuted(null, null);
            var f = new KacWindow();

            f.ShowDialog();
            MyDiag.PrintGraph(SemanticWeb.Web());
        }
예제 #19
0
 /// <summary>
 /// По словам из запроса ищет вершины сем. сети с соответствующими именами
 /// </summary>
 /// <returns>Список именованных вершин, соответствующих словам из запроса</returns>
 private List <Node> GetNodesFromQuery()
 {
     return(_inputParts
            .Where(
                word =>
                SemanticWeb.Web().NodeExists(word) && !string.IsNullOrEmpty(word) &&
                word.Trim().ToUpper() != "#System".ToUpper())
            .Select(word => SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(word))).ToList());
 }
 private void WindowLoaded1(object sender, RoutedEventArgs e)
 {
     tbName.Text         = ConceptName;
     cbTypes.ItemsSource = SemanticWeb.Web().GetAllMetaObjectNames();
     if (cbTypes.Items.Count > 0)
     {
         cbTypes.SelectedIndex = 0;
     }
 }
예제 #21
0
 public SynWindow(string fileName, string word)
 {
     _fileName = fileName;
     _word     = word;
     InitializeComponent();
     Title      = "Синонимы к слову " + _word;
     _namedNode = SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(_word));
     SetDataContext();
 }
예제 #22
0
        /// <summary>
        /// Проверяет, соединены ли 2 вершины дугами, имена которых являются атрибутами mainNode
        /// </summary>
        /// <param name="mainNode"></param>
        /// <param name="attrNode"></param>
        /// <param name="attrs"> </param>
        /// <returns>Если вершины соединены, возвращает имя атрибута (attrNode -> Name), иначе - null</returns>
        private string GetAttrNameIfExists(Node mainNode, Node attrNode, List <string> attrs)
        {
            if (!Reached(mainNode, attrs).Contains(attrNode))
            {
                return(null);
            }

            AddWayToWorkMemory(mainNode, attrNode, attrs);
            return(SemanticWeb.Web().GetNameForUnnamedNode(attrNode, true));
        }
예제 #23
0
 bool NameExist(string name)
 {
     for (int i = 0; i < SemanticWeb.Web().Nodes.Count; i++)
     {
         if (name == SemanticWeb.Web().Nodes[i].Name)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #24
0
        private void CancelExecuted(object sender, ExecutedRoutedEventArgs e)
        {
            _myWeb = SemanticWeb.ReadFromXml(_fileName);
            SetDataContext();
            var checker = new Verification(_myWeb);

            Cursor = Cursors.Wait;
            checker.Verificate();
            lbErrors.DataContext = checker.Errors;
            Cursor            = Cursors.Arrow;
            _somethingChanged = false;
        }
예제 #25
0
        /// <summary>
        /// Получает дерево всех потомков метаобъекта (без экземпляров)
        /// </summary>
        /// <param name="name"> имя, например, Ингредиент</param>
        /// <returns></returns>
        public static TreeViewItem AddSubClassesOfMetaObject(string name)
        {
            var         res       = new TreeViewItem();
            List <Node> instances = SemanticWeb.Web().GetAllAttr(SemanticWeb.Web().Atom("#System"), name);

            res.Header = name;
            foreach (var instance in instances)
            {
                res.Items.Add(AddInstances(instance, true));
            }
            return(res);
        }
예제 #26
0
        //MainObject + MainObject.AttributeValue { + MainObject.AttributeValue }

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

        /// <summary>
        /// Выполняет запрос типа MainObject + MainObject.AttributeValue { + MainObject.AttributeValue }
        /// </summary>
        /// <param name="mainObj">Имя MainObject, например, Коктейль</param>
        /// <param name="attrNode">Значение атрибута, например, Бокал</param>
        /// <returns>Например, список коктейлей в бокале</returns>
        private List <string> MainObjWithAttrsExecute(string mainObj, Node attrNode)
        {
            //коктейли в V-образном бокале для мартини
            var children = MetadataSearch.ToListWithHeader(MetadataSearch.AddInstances(attrNode, false));
            var res      = new List <string>();

            foreach (var child in children)
            {
                res.AddRange(Type1OneWord(mainObj, SafelyGetNodeByName(child, SemanticWeb.Web().GetNameForUnnamedNode(attrNode, false))));
            }
            return(res.Distinct().ToList());
        }
예제 #27
0
        private IEnumerable <Node> GetMainObjAttrNamesType1()
        {
            // Коктейль
            List <string> mainObjs = SemanticWeb.Web().GetMainMetaObjectNames();
            // Коктейль
            string name = _query.Keys.Single(mainObjs.Contains);
            // Ингредиент
            Node n = SafelyGetNodeByName(name, null);
            IEnumerable <string> mainObjAttrs = MetadataSearch.GetAttrList(n, name);

            return(_query.Values.Where((t, i) => mainObjAttrs.Contains(SemanticWeb.Web().OldestParentArc(_query.Values.ElementAt(i).ID))).ToList());
        }
예제 #28
0
 private void SaveExecuted(object sender, ExecutedRoutedEventArgs e)
 {
     //Если мы ещё ни разу не сохранялись, то идём в SaveAs
     if (FileName == string.Empty)
     {
         ApplicationCommands.SaveAs.Execute(null, null);
     }
     else
     {
         BeforeSaving();
         SemanticWeb.WriteToXml(FileName);
     }
 }
예제 #29
0
 private void NewExecuted(object sender, ExecutedRoutedEventArgs e)
 {
     //если в данный момент что-то открыто, это надо закрыть
     if (_isOpen)
     {
         ApplicationCommands.Close.Execute(null, null);
     }
     _isOpen = true;
     MyDiag.PrintGraph(SemanticWeb.Web());
     MyDiag.IsEnabled = true;
     //ChangeTopMenuNode();
     zoomInButton.IsEnabled = zoomOutButton.IsEnabled = fitButton.IsEnabled = noZoomButton.IsEnabled = true;
 }
예제 #30
0
        public ExplanationWindow(string fileName, List <Node> nodes, List <Arc> arcs)
        {
            _fileName = fileName;
            _nodes    = nodes;
            _arcs     = arcs;
            InitializeComponent();

            DD.CanEdit  = false;
            DD.FileName = _fileName;
            DD.Load     = true;
            DD.PrintGraph(SemanticWeb.Web());
            DD.AddStrokeThickness(_nodes, _arcs);
        }