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>()); }
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)); }
/// <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)) ) ) )); }
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>()); }
/// <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))); }
/// <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)))); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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)); }
/// <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; }