Лучший способ Хранить/Получать доступ Ориентированного графа

В качестве альтернативы вы можете добавить Прослушиватель событий .
addEventListener vs onclick

12
задан Michael Dorfman 30 May 2009 в 10:33
поделиться

6 ответов

Я ничего не знаю о средствах борьбы с наводнениями. Но я взял бы первое средство. И используйте временную таблицу и некоторое время цикл для генерации пути.

-- Pseudo Code
TempTable (LastNode, CurrentNode, N)

DECLARE @intN INT SET @intN = 1

INSERT INTO TempTable(LastNode, CurrentNode, N) -- Insert first item in list with no up stream items...call this initial condition SELECT LastNode, CurrentNode, @intN FROM your table WHERE node has nothing upstream

WHILE @intN <= 3500 BEGIN SEt @intN = @intN + 1 INSERT INTO TempTable(LastNode, CurrentNode, N) SELECT LastNode, CurrentNode, @intN FROM your table WHERE LastNode IN (SELECT CurrentNode FROM TempTable WHERE N = @intN-1)

IF @@ROWCOUNT = 0
     BREAK

END

Если мы предполагаем, что каждый узел указывает одному ребенку. Затем это должно взять не более 3 500 повторений. Если несколько узлов будут иметь того же восходящего поставщика затем, то это возьмет меньше. Но что еще более важно, это позволяет Вам сделать это...

ВЫБЕРИТЕ LastNode, CurrentNode, N ОТ TempTable ORDER BY N

И это позволит Вам видеть, существуют ли какие-либо циклы или какие-либо другие проблемы с Вашим поставщиком. Случайно 3 500 строк не находятся так очень поэтому даже в худшем случае каждого поставщика, указывающего на различного восходящего поставщика, это не должно занимать у этого много времени.

4
ответ дан 2 December 2019 в 20:20
поделиться

Лучший способ сохранить графики состоит в том, чтобы, конечно, использовать собственный дб графика :-)

Смотрите на neo4j. Это реализовано в Java и имеет Python и привязку Ruby также.

Я описал две страницы Wiki с простыми примерами моделей предметной области, представленных как графики с помощью neo4j: блок и роли. Больше примеров найдено на домене, моделируя страницу галереи.

6
ответ дан 2 December 2019 в 20:20
поделиться

Традиционно графики или представлены матрицей или вектором. Матрица занимает больше места, но легче обработать (3500x3500 записи в Вашем случае); вектор занимает меньше места (3 500 записей, у каждого есть список того, кого они подключают с).

Это помогает Вам?

3
ответ дан 2 December 2019 в 20:20
поделиться

я думаю, что Ваша структура данных прекрасна (для SQL Server), но CTE не может быть наиболее эффективным решением для Ваших запросов. Вы могли бы попытаться делать хранимую процедуру, которая пересекает график с помощью временной таблицы в качестве очереди вместо этого, это должно быть более эффективно.

временная таблица может также использоваться для устранения циклов в графике, хотя не должно быть никого

2
ответ дан 2 December 2019 в 20:20
поделиться

Мой опыт с хранением чего-то как Вы описанный в базе данных SQL Server:

Я хранил матрицу расстояния, говоря, сколько времени занимает путешествовать из точки для указания на B. Я сделал наивное представление и сохранил их непосредственно в таблицу, названную расстояниями со столбцами A, B, расстоянием, время.

Это очень медленно на простом извлечении. Я нашел, что это - партия лучше для хранения моей целой матрицы как текста. Затем получите его в память перед вычислениями, создайте матрицу struxture в памяти и работайте с ним там.

Я мог предоставить некоторый код, но это будет C#.

0
ответ дан 2 December 2019 в 20:20
поделиться

Да (возможно). Ваш набор данных звучит относительно небольшим, Вы могли загрузить график в память, поскольку матрица смежности или смежность перечисляют и запрашивают график непосредственно - предположение, что Вы программируете.

До дискового формата ТОЧКА является довольно портативной/популярной среди других. Также кажется довольно распространенным сохранить список краев в формате плоского файла как:

vertex1 vertex2 {edge_label1}+

Где первая строка файла содержит количество вершин в графике, и каждая строка после этого описывает края. Направлены ли края или неориентированные, до конструктора. Если Вы хотите явные ориентированные ребра, то описываете их использующий ориентированные ребра как:

vertex1 vertex2
vertex2 vertex1
1
ответ дан 2 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: