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