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 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()); }
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); }
//Тип запроса 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); }
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); }