Я отвечаю только на решение SQL. Это дает всем путям 3 шага, хотя это может быть неэффективно для больших наборов данных. Таблицы «ЗНАТЬ», «ЗНАТЬ_1» и т. Д. Все идентичны и имеют два поля P1 и P2. Он имеет запись, только если 1) P1 знает P2 или 2) P2 знает P1. Данные в P1 и P2 могут быть произвольными строками, соответствующими каждому человеку.
Этот SQL-запрос Acccess должен дать все пути, где a знает, что b знает, c знает d без циклов (например, a знает, что b знает, что c знает, знает a). Вам все еще нужно устранить дубликаты (abcd = dcba), но вы сможете легко это сделать на втором этапе. Циклы устраняются путем предотвращения повторений предыдущих людей в выражениях Where.
ВЫБРАТЬ Ноу.P1, Ноу.P2, Ноу_1.P2, Ноу_2.P2
ОТ (ЗНАЙТЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗНАЙТЕ КАК ЗНАЙТЕ_1 ВКЛЮЧИТЕ ЗНАЮ.P2 = ЗНАЮ_1.P1)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЗНАЕТ КАК ЗНАЕТ_2 ВКЛ. ЗНАЕТ_1.P2 = ЗНАЕТ_2.P1
ГДЕ (((Know_1.P2) <> [Know]. [P1]) И ((Know_2.P2) <> [Know]. [P1] И (Know_2.P2) <> [Know]. [ P2]))
ЗАКАЗАТЬ ПО ЗНАЮ.P1, Знать.P2, Знать_1.P2, Знать_2.P2;
Не так элегантно, как предыдущие решения, но, похоже, работает нормально. У нас был некоторый опыт выполнения аналогичной работы с программированием ограничений, и мы обнаружили, что процесс SQL быстрее для определенных проблем.