Вопрос дизайна.

Aug 31, 2010 23:46

Вот есть "БД" на основе гиперграфа.

У нас в этой БД есть узлы с наборами (HList) атрибутов и гипердуги с ролями-концами. Роли требуют наличия определённых наборов атрибутов у включаемых узлов, например, роль "файл" гипердуги "первая строка файла" содержит требование, чтобы узел содержал атрибут "Имя файла" со строковым значением. У той же гипердуги вторая роль называется "первая строка файла" и требует, чтобы подсоединяемый узел имел атрибут "строка файла".

Как бы спроектировать язычок запросов?

Большую часть времени мы просто можем ходить по концам дуг: дай мне все узлы, стартующие из вот этого набора, которые можно получить, пройдя по таким концам дуг. Получается регулярное выражение, с альтернативами и прочим.

Примитив againstRole Role должен принять набор узлов, пройтись по всем их соединениям гипердугами и дополнить набор пройденных узлами, что соединены гипердугой с ролью-окончанием Role.

Оператор альтернативы (например, +++) позволит нам пройтись по нескольким ролям одновременно.

Оператор many выполнит навигацию по его аргументу до упора - пока будут узлы, что мы ещё не обошли.

Получится обход в ширину графа по определённым связям.

Если завести набор интересных узлов, то примитив interesting может добавлять текущее множество, полученное последней операцией навигации к множеству интересных. На него же можно навесить фильтр, как и на операцию againstRole (хотя тут роль не полностью определяет варианты атрибутов узла).

В конце мы можем получить как все пройдённые узлы, так и интересные нам.

По идее, на это можно будет навесить оптимизацию.

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

И даже можно сделать подсветку синтаксиса. ;)

Монадический вариант мне нравится больше. Надо его продумать. Здесь основной момент - как сделать обход вширь, но, возможно, недетерминированный, чтобы можно было обрабатывать узлы как независимо, так и с учётом соседей.

Подумаю.

базы данных, графы

Previous post Next post
Up