Beispiel #1
0
        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());
        }
Beispiel #2
0
        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());
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        //Тип запроса 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);
        }
Beispiel #5
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);
        }