Beispiel #1
0
        private static List <IReadOnlyRelation> GetAgentRelations(IReadOnlyNode agent, IReadOnlyNode parentAgent)
        {
            if (agent == parentAgent)
            {
                return(new List <IReadOnlyRelation>());
            }

            if (agent.FromIsA().Any(currentNode => currentNode == parentAgent))
            {
                return(new List <IReadOnlyRelation> {
                    agent.FromRelations.Where(x => x.Name == Relations.IsA).First(x => x.To == parentAgent)
                });
            }

            foreach (var node in agent.FromIsA())
            {
                var relations = GetAgentRelations(node, parentAgent);
                if (relations.Count <= 0)
                {
                    continue;
                }
                relations.Add(node.FromRelations.Where(x => x.Name == Relations.IsA).FirstOrDefault(x => x.To == agent));
                return(relations);
            }

            return(new List <IReadOnlyRelation>());
        }
Beispiel #2
0
        private static IReadOnlyNode GetParentAgent(IReadOnlyNode agent)
        {
            if (agent.Name == EmptyOntologyNode.Name)
            {
                return(agent);
            }

            var agents = new Queue <IReadOnlyNode>();

            agents.Enqueue(agent);
            while (agents.Count > 0)
            {
                agent = agents.Dequeue();
                if (agent.ToRelations.Any(x => x.Name == Relations.Agent))
                {
                    return(agent);
                }
                foreach (var node in agent.FromIsA())
                {
                    agents.Enqueue(node);
                }
            }

            throw new ArgumentException();
        }
        /// <summary>
        /// Возвращает коллекцию узлов, которые вложенно исходят по указанной связи.
        /// </summary>
        /// <param name="node">Узел</param>
        /// <param name="relationName"></param>
        /// <returns>Коллекция узлов.</returns>
        public static IReadOnlyNodeCollection FromNested(this IReadOnlyNode node, string relationName)
        {
            var nodeCollection = node.From(relationName).ToList();
            var result         = new List <IReadOnlyNode>(nodeCollection);

            foreach (var readOnlyNode in nodeCollection)
            {
                result.AddRange(readOnlyNode.FromNested(relationName));
            }
            return(new NodeCollection(result));
        }
Beispiel #4
0
 /// <summary>
 /// Возвращает множество узлов, которые подходят по иерархии с заданными связями
 /// </summary>
 /// <param name="node">Узел части фрейма.</param>
 /// <param name="toRelation">Связь части фрейма.</param>
 /// <param name="fromRelation">Узлы со связями которые надо найти.</param>
 /// <returns>Множество узлов.</returns>
 private static IEnumerable <IReadOnlyNode> GetRelevant(IReadOnlyNode node, string toRelation,
                                                        string fromRelation)
 {
     return(node.To(toRelation)
            .SelectMany(x => x.From(fromRelation))
            .Union(node
                   .To(toRelation)
                   .SelectMany(x => x
                               .ToIsANestedFrom(fromRelation)
                               .Union(x
                                      .FromIsANested()
                                      .Where(y => y.Name != Nodes.MainFrameNode)
                                      .SelectMany(y => y.From(fromRelation))
                                      )
                               )
                   ));
 }
Beispiel #5
0
        private static List <IReadOnlyRelation> GetRelations(IReadOnlyNode node, IReadOnlyNode nodeToFind, string relation, bool isFrom)
        {
            if (node.From(relation).Any(currentNode => currentNode == nodeToFind))
            {
                return(new List <IReadOnlyRelation> {
                    node.FromRelations.First(x => x.To == nodeToFind)
                });
            }

            foreach (var currentNode in isFrom ? node.FromIsA() : node.ToIsA())
            {
                var relations = GetRelations(currentNode, nodeToFind, relation, isFrom);
                if (relations.Count <= 0)
                {
                    continue;
                }
                var toNode   = node.ToRelations.FirstOrDefault(x => x.From == currentNode);
                var fromNode = node.FromRelations.FirstOrDefault(x => x.To == currentNode);
                relations.Add(isFrom ? fromNode : toNode);
                return(relations);
            }

            return(new List <IReadOnlyRelation>());
        }
Beispiel #6
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по связи <see cref="Relations.Locative"/> из всех нижележащих узов по вложенной входящей связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToIsANestedFromLocative(this IReadOnlyNode node)
 {
     return(node.ToNestedFrom(Relations.IsA, Relations.Locative));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.Has"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToHas(this IReadOnlyNode node)
 {
     return(node.To(Relations.Has));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по определенной связи из всех нижележащих узов по определенной вложенной входящей связи.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <param name="relationNameTo">Наименование вложенной входящей связи.</param>
 /// <param name="relationNameFrom">Наименование исходящей связи.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToNestedFrom(this IReadOnlyNode node, string relationNameTo, string relationNameFrom)
 {
     return(new NodeCollection(node.ToNested(relationNameTo).SelectMany(x => x.From(relationNameFrom))));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят из указанного узла по определенной связи.
 /// </summary>
 /// <param name="node">Узел.</param>
 /// <param name="relationName">Наименование связи узла.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection From(this IReadOnlyNode node, string relationName)
 {
     return(new NodeCollection(node.FromRelations.Where(x =>
                                                        string.Equals(x.Name.Trim(), relationName.Trim(), StringComparison.CurrentCultureIgnoreCase))
                               .Select(x => x.To)));
 }
Beispiel #10
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по определенной связи из всех нижележащих узов по определенной вложенной исходящей связи.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <param name="firstRelationNameFrom">Наименование вложенной исходящей связи.</param>
 /// <param name="secondRelationNameFrom">Наименование исходящей связи.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromNestedFrom(this IReadOnlyNode node, string firstRelationNameFrom, string secondRelationNameFrom)
 {
     return(new NodeCollection(node.FromNested(firstRelationNameFrom).SelectMany(x => x.From(secondRelationNameFrom))));
 }
Beispiel #11
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по определенной связи из всех нижележащих узов по вложенной исходящей связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <param name="relationName">Наименование связи.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromIsANestedFrom(this IReadOnlyNode node, string relationName)
 {
     return(node.FromNestedFrom(Relations.IsA, relationName));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят из указанного узла по связи <see cref="Relations.Agent"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromAgent(this IReadOnlyNode node)
 {
     return(node.From(Relations.Agent));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят из указанного узла по связи <see cref="Relations.Order"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromOrder(this IReadOnlyNode node)
 {
     return(node.From(Relations.Order));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят из указанного узла по связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromIsA(this IReadOnlyNode node)
 {
     return(node.From(Relations.IsA));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.APartOf"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToAPartOf(this IReadOnlyNode node)
 {
     return(node.To(Relations.APartOf));
 }
Beispiel #16
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по связи <see cref="Relations.Agent"/> из всех нижележащих узов по вложенной входящей связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToIsANestedFromAgent(this IReadOnlyNode node)
 {
     return(node.ToNestedFrom(Relations.IsA, Relations.Agent));
 }
Beispiel #17
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые вложенно входят по связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToIsANested(this IReadOnlyNode node)
 {
     return(node.ToNested(Relations.IsA));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят из указанного узла по связи <see cref="Relations.Has"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromHas(this IReadOnlyNode node)
 {
     return(node.From(Relations.Has));
 }
Beispiel #19
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые исходят по связи <see cref="Relations.Object"/> из всех нижележащих узов по вложенной входящей связи <see cref="Relations.IsA"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromIsANestedFromObject(this IReadOnlyNode node)
 {
     return(node.FromNestedFrom(Relations.IsA, Relations.Object));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.Order"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToOrder(this IReadOnlyNode node)
 {
     return(node.To(Relations.Order));
 }
Beispiel #21
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят по определенной связи из всех нижележащих узов по определенной вложенной исходящей связи.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <param name="relationNameFrom">Наименование вложенной исходящей связи.</param>
 /// <param name="relationNameTo">Наименование входящей связи.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection FromNestedTo(this IReadOnlyNode node, string relationNameFrom, string relationNameTo)
 {
     return(new NodeCollection(node.FromNested(relationNameFrom).SelectMany(x => x.To(relationNameTo))));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.Object"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToObject(this IReadOnlyNode node)
 {
     return(node.To(Relations.Object));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.Locative"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToLocative(this IReadOnlyNode node)
 {
     return(node.To(Relations.Locative));
 }
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят в указанный узел по связи <see cref="Relations.Agent"/>.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToAgent(this IReadOnlyNode node)
 {
     return(node.To(Relations.Agent));
 }
Beispiel #25
0
 /// <summary>
 /// Возвращает коллекцию узлов, которые входят по определенной связи из всех нижележащих узов по определенной вложенной входящей связи.
 /// </summary>
 /// <param name="node">Узел</param>
 /// <param name="firstRelationNameTo">Наименование вложенной входящей связи.</param>
 /// <param name="secondRelationNameTo">Наименование входящей связи.</param>
 /// <returns>Коллекция узлов.</returns>
 public static IReadOnlyNodeCollection ToNestedTo(this IReadOnlyNode node, string firstRelationNameTo, string secondRelationNameTo)
 {
     return(new NodeCollection(node.ToNested(firstRelationNameTo).SelectMany(x => x.To(secondRelationNameTo))));
 }
 public OntologyRelation(string name, IReadOnlyNode from, IReadOnlyNode to)
 {
     Name = name;
     From = from;
     To   = to;
 }