Проще говоря, у меня есть таблица, представляющая отношение.Строки в таблице представляют пары в моем отношении.Другими словами, первая строка указывает, что идентификатор 1 связан с идентификатором 4 и что идентификатор 4 связан с идентификатором 1. Надеюсь, вам нетрудно увидеть, что мое отношение симметрично,хотя таблица показывает эту симметрию в сжатой форме.
+-----+-----+
| id1 | id2 |
+-----+-----+
| 1 | 4 |
| 3 | 1 |
| 2 | 1 |
| 2 | 3 |
| 2 | 4 |
| 5 | 1 |
+-----+-----+
РЕДАКТИРОВАТЬ Эта таблица предназначена для краткого отображения следующего отношения:
{(1,4), (4,1), (3,1), (1,3), (2,1), (1,2), (2,3), (3,2), (2,4), (4,2), (5,1), (1,5)}.Это может быть визуализировано следующим неориентированным графиком.
CREATE TABLE Test (
id1 int not null,
id2 int not null);
INSERT INTO Test
VALUES
(1,4),
(3,1),
(2,1),
(2,3),
(2,4),
(5,1);
Я хотел бы определить транзитивные подмножества ( клики ) в моей таблице.
РЕДАКТИРОВАТЬ Например, я хотел бы определить переходное подмножество, продемонстрированное тем фактом, что идентификатор 3 связан с идентификатором 1, а идентификатор 1 связан с идентификатором 2подразумевает, что идентификатор 3 связан с идентификатором 2. (Они могут быть видны как треугольники на фото ненаправленного графика. Хотя, в лучшем случае, я хотел бы иметь возможность перечислить другие complete подграфы, которые больше, чем треугольники, если они присутствуют в исходной таблице / графике.)
Я пытался сделать следующее, но набор результатов больше, чем я хочу.Я надеюсь, что есть более простой способ.
select t1.id1, t1.id2, t2.id1, t2.id2, t3.id1, t3.id2
from test as t1
join test as t2
on t1.id1 = t2.id1
or t1.id2 = t2.id2
or t1.id1 = t2.id2
or t1.id2 = t2.id1
join test as t3
on t2.id1 = t3.id1
or t2.id2 = t3.id2
or t2.id1 = t3.id2
or t2.id2 = t3.id1
where
not
(
t1.id1 = t2.id1
and
t1.id2 = t2.id2
)
and not
(
t2.id1 = t3.id1
and
t2.id2 = t3.id2
)
and not
(
t1.id1 = t3.id1
and
t1.id2 = t3.id2
)
and
(
(
t3.id1 = t1.id1
or
t3.id1 = t1.id2
or
t3.id1 = t2.id1
or
t3.id1 = t2.id2
)
and
(
t3.id2 = t1.id1
or
t3.id2 = t1.id2
or
t3.id2 = t2.id1
or
t3.id2 = t2.id2
)
);
Фактический результат:
+-----+-----+-----+-----+-----+-----+
| id1 | id2 | id1 | id2 | id1 | id2 |
+-----+-----+-----+-----+-----+-----+
| 1 | 4 | 2 | 4 | 2 | 1 |
| 1 | 4 | 2 | 1 | 2 | 4 |
| 3 | 1 | 2 | 3 | 2 | 1 |
| 3 | 1 | 2 | 1 | 2 | 3 |
| 2 | 1 | 2 | 4 | 1 | 4 |
| 2 | 1 | 2 | 3 | 3 | 1 |
| 2 | 1 | 3 | 1 | 2 | 3 |
| 2 | 1 | 1 | 4 | 2 | 4 |
| 2 | 3 | 2 | 1 | 3 | 1 |
| 2 | 3 | 3 | 1 | 2 | 1 |
| 2 | 4 | 2 | 1 | 1 | 4 |
| 2 | 4 | 1 | 4 | 2 | 1 |
+-----+-----+-----+-----+-----+-----+
Ожидаемый набор результатов будет иметь только две строки.Каждая строка будет представлять транзитивное отношение, которое является подмножеством исходного отношения.
╔═════╦═════╦═════╦═════╦═════╦═════╗
║ id1 ║ id2 ║ id1 ║ id2 ║ id1 ║ id2 ║
╠═════╬═════╬═════╬═════╬═════╬═════╣
║ 1 ║ 4 ║ 2 ║ 4 ║ 2 ║ 1 ║
║ 3 ║ 1 ║ 2 ║ 1 ║ 2 ║ 3 ║
╚═════╩═════╩═════╩═════╩═════╩═════╝
EDIT Ожидаемый результат также может выглядеть следующим образом:
╔═════╦═════╦═════╗
║ id1 ║ id2 ║ id3 ║
╠═════╬═════╬═════╣
║ 1 ║ 4 ║ 2 ║
║ 3 ║ 1 ║ 2 ║
╚═════╩═════╩═════╝,
независимо от того,это легче.Мне просто нужно показать тот факт, что наборы
{(1,4), (4,1), (2,4), (4,2), (2,1), (1,2)}
и
{(3,1), (1,3), (2,1), (1,2), (2,3), (3,2)}
являются правильными подмножествамиисходного отношения и сами являются переходными отношениями.Я использую определение, что отношение R транзитивно тогда и только тогда, когда ∀a∀b∀c ((a, b) ∈R ∧ (b, c) ∈R → (a, c) ∈R).Другими словами, я пытаюсь найти все подграфы , которые также являются полными графами .
Я новичок в теории графов, но, похоже, моя проблема в том, чтоаналогично проблеме клики , где я ищу клики, содержащие 3 или более вершин.Я бы принял в качестве ответа решения, которые возвращают только клики с 3 вершинами.Мой вопрос похож на этот один.Однако представленные там решения, кажется, не используют определение клики, которую я хочу, чтобы каждая вершина была связана с каждой другой вершиной внутри клики.
Здесь - это алгоритмЯ нашел с помощью Java.Надеюсь, это поможет в реализации с использованием SQL.