Microsoft GraphEngine LIKQ запрос
Описание
У меня есть простой ориентированный граф, который имеет два конечных узла C,E (приемники) и один начальный узел A. Используемая мной среда - это GraphEngine от Microsoft.
Мой файл TSL выглядит так: Узел графа состоит из NodeItem, который является просто контейнером со свойством Id и Name. Узел имеет OutEdges для исходящих отношений и InEdges для входящих выпусков.
Я знаю, что есть несколько алгоритмов графов, таких как A*, Dijkstra, Floyd Warshall, Bellman–Ford и т. Д.... Каждый из них решает очень специфические задачи обхода. Все идет нормально. Но теперь я хочу узнать, как пройти этот граф с LIKQ. LIKQ - это язык запросов на знание языка. Он позволяет пользователям запрашивать, искать и использовать знания в режиме реального времени с помощью обхода графа и лямбда-выражений.
Вопрос
Что я хочу сделать: Найти все кратчайшие пути между узлами A и C и узлами A и E. Это возможно с LIKQ?
Это то, что я получил так далеко:
List<PathDescriptor> paths = KnowledgeGraph.StartFrom(start)
.FollowEdge("OutEdges")
.VisitNode(_ => Action.Continue)
.FollowEdge("OutEdges")
.VisitNode(_ => Action.Continue)
.FollowEdge("OutEdges")
.VisitNode(_ => Action.Return)
.ToList();
Я могу пройти от A - B - D - E. Но это как-то ручной шаг. Есть ли шанс позволить LIKQ решить, как начать с узла A и получить два пути (к C и E) в качестве возврата?
Кроме того, я хотел бы знать, можно ли перевести BFS или DFS в LIKQ?
Надеюсь, что кто-то может принести свет в темноту (: Большое спасибо заранее!
С наилучшими пожеланиями, Фил
1 ответ
В настоящее время это немного сложно, алгоритм поиска разветвления не гарантирует порядок пропущенных шагов обхода, но более короткие пути планируются практически раньше. Так что если вы положите Action.Continue & Action.Return
на каждом шаге сделайте глобальную переменную-флаг, чтобы при достижении цели переключать этот бит так, чтобы все остальные пути чтения могли его прекратить, тогда вы, вероятно, получите кратчайший путь.