예제 #1
0
        /// <summary>
        /// Генерирует ситуацию по неполному заполнению.
        /// </summary>
        /// <param name="situation">Исходная ситуация с пустыми полями.</param>
        /// <param name="situationName">Наименование ситуации в онтологии</param>
        /// <returns>Заполненная ситуация.</returns>
        public Situation GenerateSituation(Situation situation, string situationName)
        {
            var resultSituation = new SafeSituation();
            var relevantNodes   = GetRelevantNodes(situation, situationName);

            if (situation.Agent.Name != EmptyOntologyNode.Name)
            {
                resultSituation.Agent = situation.Agent;
            }
            else if (relevantNodes.Agents.Any())
            {
                var agentItem = relevantNodes.Agents.ToNodeCollection().GetRandom();
                resultSituation.Agent = agentItem;
                relevantNodes         = GetRelevantNodes(relevantNodes, resultSituation, Relations.Agent);
            }

            if (situation.Action.Name != EmptyOntologyNode.Name)
            {
                resultSituation.Action = situation.Action;
            }
            else if (relevantNodes.Actions.Any())
            {
                var actionItem = relevantNodes.Actions.ToNodeCollection().GetRandom();
                resultSituation.Action = actionItem;
                relevantNodes          = GetRelevantNodes(relevantNodes, resultSituation, Relations.Action);
            }

            if (situation.Object.Name != EmptyOntologyNode.Name)
            {
                resultSituation.Object = situation.Object;
            }
            else if (relevantNodes.Objects.Any())
            {
                var objectItem = relevantNodes.Objects.ToNodeCollection().GetRandom();
                resultSituation.Object = objectItem;
                relevantNodes          = GetRelevantNodes(relevantNodes, resultSituation, Relations.Object);
            }

            resultSituation.Locative = situation.Locative.Name != EmptyOntologyNode.Name
                ? situation.Locative
                : relevantNodes.Locatives.Any()
                    ? relevantNodes.Locatives.ToNodeCollection().GetRandom()
                    : new EmptyOntologyNode();

            return(resultSituation);
        }
예제 #2
0
        public DangerousSituation GenerateDangerousSituation(SafeSituation safeSituation)
        {
            var dangerousSituation = new DangerousSituation();
            var nodes = safeSituation
                        .GetNodes()
                        .Where(x =>
                               x.FromRelations.Any(y => y.Name == Relations.Affects || y.Name == Relations.APartOf) ||
                               x.ToRelations.Any(y => y.Name == Relations.Affects || y.Name == Relations.APartOf)
                               )
                        .ToNodeCollection();

            if (nodes.Count > 0)
            {
                var node     = nodes.GetRandom();
                var relation = node.FromRelations
                               .Union(node.ToRelations)
                               .Where(x => x.Name == Relations.Affects || x.Name == Relations.APartOf)
                               .ToRelationCollection()
                               .GetRandom();
                var dangerousNode = OntologyHelper.GetDangerousNode(relation);
                if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Agent))
                {
                    dangerousSituation.Agent = dangerousNode;
                }

                if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Action))
                {
                    dangerousSituation.Action = dangerousNode;
                }

                if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Object))
                {
                    dangerousSituation.Object = dangerousNode;
                }

                if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Locative))
                {
                    dangerousSituation.Locative = dangerousNode;
                }
            }
            return(GenerateSituation(dangerousSituation, Nodes.DangerousSituation).ToDangerousSituation());
        }