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()); }
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)); } }
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); } }
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); } }
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); }
/// <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; }
/// <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; }
//Тип запроса 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); }
/// <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) { } }
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); }
/// <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); }
private string GetMainObjNameType1() { List <string> mainObjs = SemanticWeb.Web().GetMainMetaObjectNames(); return(_query.Keys.Single(mainObjs.Contains)); }
private bool IsComplex(string word) { var unnamedNode = SemanticWeb.Web().GetUnnamedNodesForName(word); return(SemanticWeb.Web().GetAllAttr(unnamedNode.ID, "#HasAttribute").Count != 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); }
private void AddSynonym() { var parentNamedNode = SemanticWeb.Web().Mota(SemanticWeb.Web().Atom(((TreeViewItem)twIsA.SelectedItem).Header.ToString())); parentNamedNode.AddSynonym(tbName.Text); }