/// <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); }
/// <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; } }
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); } }
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); }
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?!"); }
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); }
/// <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 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; }
private void SynEditOnClick(object sender, RoutedEventArgs routedEventArgs) { var w = new SynWindow(FileName, ((Node)_rightNode.Tag).Name); w.ShowDialog(); PrintGraph(SemanticWeb.Web()); }
/// <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//откуда }
/// <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); } }
public void SaveCoordinates() { foreach (DiagramNode t in DD.Nodes) { SemanticWeb.Web().ChangeNodeCoordinates(((Node)t.Tag).ID, t.Bounds.X, t.Bounds.Y); } }
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); }
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, то успех }
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("изменения отменены"); }
/*отменить*/ private void loadButton_Click(object sender, RoutedEventArgs e) { reload = true; myWeb = SemanticWeb.ReadFromXml(path); PrintGraph(myViewWeb); reload = false; SendMessage("изменения отменены"); }
public void EditWithFormsExecuted(object sender, ExecutedRoutedEventArgs e) { SaveExecuted(null, null); var f = new KacWindow(); f.ShowDialog(); MyDiag.PrintGraph(SemanticWeb.Web()); }
/// <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; } }
public SynWindow(string fileName, string word) { _fileName = fileName; _word = word; InitializeComponent(); Title = "Синонимы к слову " + _word; _namedNode = SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(_word)); SetDataContext(); }
/// <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)); }
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); }
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; }
/// <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); }
//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()); }
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()); }
private void SaveExecuted(object sender, ExecutedRoutedEventArgs e) { //Если мы ещё ни разу не сохранялись, то идём в SaveAs if (FileName == string.Empty) { ApplicationCommands.SaveAs.Execute(null, null); } else { BeforeSaving(); SemanticWeb.WriteToXml(FileName); } }
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; }
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); }