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