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