Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Хранение и редактирование графа / 25 сообщений из 30, страница 1 из 2
18.10.2009, 20:07
    #36258198
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Требуется редактировать граф и отображать в виде матрицы смежности:

| Пункт_1 | Пункт_2 | Пункт_3 | Пункт_4....
| Пункт_1 | Вес11 | Вес12 | Вес13 |
| Пункт_2 | Вес21 | Вес12 | Вес23 |
| Пункт_3 | Вес31 | Вес32 | Вес33 |
| Пункт_4 | Вес41 | Вес42 | Вес43 |
.....

Как мне его следует хранить? Предполагал в виде списка. И как тогда выводить и редактировать?
...
Рейтинг: 0 / 0
18.10.2009, 20:28
    #36258214
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyz,

0. Как хранить - Вам виднее. Направленный это граф или нет, что в нём является вершинами (просто АА12С или сущности с атрибутами), допустимы ли петли и рёбра с одинаковыми вершинами, но разными весами - от всего этого будет зависеть структура.
1. Как выводить и редактировать - это уже вопрос к заказчику, он (хотя бы подсознательно) знает, как ему удобнее. Или Вы для форума пишите приложение? :) Да, чтобы Вы сразу не шагнули в сторону табличных отчётов для отображения: даже матрица 100x100 с большими идентификаторами рёбер выглядеть будет не очень презентабельно.
...
Рейтинг: 0 / 0
18.10.2009, 21:04
    #36258252
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Для института делаю. Граф будет однонаправленный, без петель, объемов больших не надо. Думаю табличка будет 20х20 максимум, поэтому и решил, что презентабельно будет выглядеть. Хочется именно таблицей, потому-что списком редактировать не проблема (а именно проблем и надо побольше). Я вот не могу понять, можем ли мы одним запросом сформировать таблицу, колонками, которой будут являться различные строки исходной таблицы (вершины графа), первая колонка будет дублировать названия всех колонок, а значения в строках будут веса ребер. Попытаюсь переформулировать: Граф задан списком, надо его одним запросом выразить матрицей смежности. Можем ли мы это выполнить?
...
Рейтинг: 0 / 0
18.10.2009, 21:42
    #36258282
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyz,

да, можем. В таком простом случае хранение - таблицы вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table nodes (node# primary key);

create table edges 
( start_node number
, end_node number
, weight number);

alter table edges add constraint edges_pk primary key(start_node, end_node);
alter table edges add constraint edges_start_node_fk foreign key (start_node) references nodes(node#);
alter table edges add constraint edges_end_node_fk foreign key (end_node) references nodes(node#);
alter table edges add constraint edges_diff_nodes check (start_node <> end_node);
Вот как от петель избавиться - это будет интересным заданием. :)

Насчёт вывода в виде матрицы смежности: какая версия Oracle Database у Вас? Если 11g, то есть встроенный оператор pivot, если более старая - Вам нужно будет собрать строку запроса циклом по вершинам в процедуре и вернуть её в апексовский регион-отчёт.
...
Рейтинг: 0 / 0
18.10.2009, 22:19
    #36258324
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Я делаю на http://apex.oracle.com смею предположить, что там 11G?
...
Рейтинг: 0 / 0
18.10.2009, 22:25
    #36258332
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Петель быть не должно, т.к. я буду модель авиа-бронирования делать (сильно упрощенную, до минимума), будет глупо выглядеть перелет из точки А в точку А = )
...
Рейтинг: 0 / 0
18.10.2009, 23:22
    #36258379
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyzЯ делаю на http://apex.oracle.com смею предположить, что там 11G?
Да, там 11g. Но в следующий раз вместо вопроса выполните:
Код: plaintext
select * from v$version
чтобы убрать сомнения. :)
...
Рейтинг: 0 / 0
19.10.2009, 00:09
    #36258414
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Извените, я просто все там посмотрел, но версии не нашел, а про команду эту не подумал (только начинаю с запросами). Сейчас вот с Pivot разбераюсь, я сам разберусь, мне хотелось бы узнать, могу ли я пользоваться этой структурой, если у меня колонки не заданы жестко (во всех примерах, которые я пока видел, предполагается, что мы знаем значения перевернутых колонок)?
...
Рейтинг: 0 / 0
19.10.2009, 00:16
    #36258416
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyz,

да, сможете. Вот хорошие пример: Oracle Database 11g: The Top New Features for DBAs and Developers - Pivot and Unpivot .
...
Рейтинг: 0 / 0
19.10.2009, 00:42
    #36258427
Ales Protiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Судя по документации выражение pivot_in предусматривает вариант не с перечислением значений, а c subquery - должно было бы помочь. Но короткие эксперименты результатов не дали :(
...
Рейтинг: 0 / 0
19.10.2009, 00:56
    #36258437
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
В pivot можно использовать
select * from (
select times_purchased, state_code
from customers t
)
pivot xml
(
count(state_code)
for state_code in (any)
)
order by times_purchased


Но мне упорно выбивает
TIMES_PURCHASED STATE_CODE_XML
1 [unsupported data type]
2 [unsupported data type]
4 [unsupported data type]
10 [unsupported data type]

В документации указано:
The output comes back as CLOB so make sure the LONGSIZE is set to a large value before running the query.

SQL> set long 99999

Но после выполнения этого запроса, я получаю:
ORA-00922: отсутствует или неверна опция
...
Рейтинг: 0 / 0
19.10.2009, 01:19
    #36258445
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
select * from (
select times_purchased as "Puchase Frequency", state_code
from customers t
)
pivot xml
(
count(state_code)
for state_code in (select state_code from preferred_states)
)
order by 1

В вспомогательной таблице preferred_states всего один элемент, получаю сообщение
ORA-00918: столбец определен неоднозначно
...
Рейтинг: 0 / 0
19.10.2009, 11:54
    #36258989
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Ales ProtivСудя по документации выражение pivot_in предусматривает вариант не с перечислением значений, а c subquery - должно было бы помочь. Но короткие эксперименты результатов не дали :(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH t0 AS (SELECT LEVEL n FROM dual CONNECT BY LEVEL <=  20 )
   , t AS (SELECT t1.n n, t2.n m, decode(t1.n, t2.n,  1 ) eq FROM t0 t1, t0 t2)
SELECT *
  FROM t
pivot xml
 ( count(eq)
   for n in (SELECT LEVEL n FROM dual CONNECT BY LEVEL <=  20 ));

WITH t0 AS (SELECT LEVEL n FROM dual CONNECT BY LEVEL <=  20 )
   , t AS (SELECT t1.n n, t2.n m, decode(t1.n, t2.n,  1 ) eq FROM t0 t1, t0 t2)
SELECT *
  FROM t
pivot xml
 ( count(eq)
   for n in (ANY));

Работает и так, и так. Главное, распарсить потом в приемлемый вид.
...
Рейтинг: 0 / 0
19.10.2009, 12:13
    #36259053
Ales Protiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Интересовал как раз обычный pivot, не xml.
Вобщем ясно - в этих pivot'ах ничего нового: раньше то же самое делалось с decode и xmlagg.
...
Рейтинг: 0 / 0
19.10.2009, 12:35
    #36259132
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Ales ProtivИнтересовал как раз обычный pivot, не xml.
Вобщем ясно - в этих pivot'ах ничего нового: раньше то же самое делалось с decode и xmlagg.

По доке подзапрос и ANY поддерживаются только в XML-варианте пайвота. И - да, это просто ради удобства. :) Может быть, стремятся задать направление очередному SQL:20XX...

ТС, всё же Вам проще будет собрать строку запроса в PL/SQL, чем парсить XML, кмк.
...
Рейтинг: 0 / 0
19.10.2009, 13:11
    #36259273
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Извините еще раз, что спрашиваю очевидные вещи, мы можем сами комбинировать строку запроса? т.е. я смогу сделать перечисление требуемых колонок и использовать обычный pivot, для динамического? Если бы я делал не через APEX, то проблем бы не возникло, делаем запрос, получаем список колонок, собираем запрос для Pivot, а вот, что делать в этом случае, мы какой-то язык программирования можем использовать в APEX и вставлять функции прямо в SourseTable?
...
Рейтинг: 0 / 0
19.10.2009, 13:33
    #36259382
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyz,

Вы можете вставить в Source для отчёта либо сам запрос, либо PL/SQL-блок, возвращающий строку запроса. Например . Вот PL/SQL-блок Вам и нужно состряпать (лучше, как возвращающий строку-результат хранимой в БД функции).
...
Рейтинг: 0 / 0
19.10.2009, 22:47
    #36260822
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Делаю в виде хранимой функции, но не могу понять, как мне ее в Sourse вставить? или как отлаживать хотябы?
...
Рейтинг: 0 / 0
19.10.2009, 22:52
    #36260827
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
В Sourse пишу
begin return 'select * from PREFERRED_STATES'; end;
или
COLS;
получаю ошибку
Query cannot be parsed within the Builder. If you believe your query is syntactically correct, check the ''generic columns'' checkbox below the region source to proceed without parsing. ORA-06550: Строка 1, столбец 50: PLS-00103: Встретился символ "end-of-file" в то время как ожидалось одно из следующих: ; <идентификатор> <идентификатор с двойными кавычками-разделителями> Символ ";" заменен на "end-of-file", чтобы можно было продолжать.
...
Рейтинг: 0 / 0
19.10.2009, 23:08
    #36260840
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Куда вставлять я разобрался, вставлял в Table, вставил в Report и все, но теперь не понятно как вставлять, у меня есть функция которая возвращает строку запроса (COLS), в Sourse стоит вставлять
begin COLS; end; ?
...
Рейтинг: 0 / 0
19.10.2009, 23:38
    #36260857
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyzКуда вставлять я разобрался, вставлял в Table, вставил в Report и все, но теперь не понятно как вставлять, у меня есть функция которая возвращает строку запроса (COLS), в Sourse стоит вставлять
Код: plaintext
begin COLS; end;
?
Да. Ваша функция должна возвращать текст запроса. Отладка простая: в SQL Commands вызов функции вида
Код: plaintext
1.
2.
begin
  dbms_output.put_line(COLS);
end;
Копируете запрос, пробуете выполнить. Выводит то, что надо - отлично.

Я так понимаю, "под рукой" у Вас Oracle нет, только apex.oracle.com?
...
Рейтинг: 0 / 0
19.10.2009, 23:52
    #36260864
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Спасибо за ответ, сейчас засел за теорию по PL\SQL, чтобы вопросов глупых поменьше задавать, Oracle есть, но я его настраивал, под виртуальной машиной и на нетбуке, вообщем там так тормозит все, что ужас просто.
...
Рейтинг: 0 / 0
20.10.2009, 00:25
    #36260888
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
vantyz,

Oracle XE поставьте, для тестов в Вашем случае - с головой. Без всяких виртуалок, просто на ОС Вашей машины, читая руководство по установке (если понадобиться).
...
Рейтинг: 0 / 0
20.10.2009, 00:32
    #36260897
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
а там настроено уже Apex?
...
Рейтинг: 0 / 0
20.10.2009, 00:40
    #36260905
vantyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Хранение и редактирование графа
Нашел только 10G, а Вы писали, что пивот, только в 11G есть
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Хранение и редактирование графа / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]