суббота, 30 января 2016 г.

Сетевая база в одном файле 2

Нужно обеспечить возможность по предоставленной строке находить соответствующий ей узел и, наоборот, по номеру узла находить строковое значение. Строке можно в соответствие поставить хэш. И потом этот хэш можно разместить внутри графа.

Первые адреса резервируются под символы, которые присутствуют в хэше. Дальше строится дерево по мере увеличения количества значений, привязанных к графу. Данный механизм строится поверх системы хранения связей.

четверг, 28 января 2016 г.

Сетевая база в одном файле

Размышляя над системой, написанной на PHP, пришёл к пониманию того, что лежащую в основе графовую базу данных нужно переработать. Порядок привязанных узлов нужно отслеживать на уровне базы данных. Желательно сократить список технологий, задействованных при реализации базы данных, и максимально всё упростить. В идеале описать формальные требования. Чем и займусь.

  1. Записи не удаляются.
  2. Связи могут только добавляться.
  3. Связи имеют направление.
  4. Одному строковому значению соответствует один узел.
  5. У всех узлов есть значение - NULL или хэш строки.
  6. Хранятся только цепочки связей.
  7. Звено ценпи состоит из порядкового номера звена, номера следующего звена и ссылки на звено-узел.
  8. Порядковый номер звена соответствует его расположению в файле.
  9. Узел - это первое звено в цепочке, которое не указывает на другие узлы.
  10. При каждом запросе узла, создаётся новый объект.
Пример: узел 3 связан с узлами 1 и 2.

address    next    link    комментарий
1          0       1       узел 1
2          0       2       узел 2
3          4       5       узел 3 (последнее звено 5)
4          5       1       связь узла 3 с узлом 1
5          0       2       связь узла 3 с узлом 2 (последняя в цепи)
6          0       6       узел 6

Поскольку приложение, использующее базу данных, отслеживает тип узла, нет необходимости помечать узлы, привязанные к значениям. Функция node.hasValue() не нужна.




четверг, 7 января 2016 г.

Компьютерная лингвистика, так сказать...

Попытался между делом написать код на PHP под правила языка, описанные в одной из предыдущих статей.

Работа ещё не завершена, но что-то уже прорисовывается. Можно нащупать проблемные места и сделать доработки. Код выложен на GitHub.

Код разделён на две части: сетевая (графовая) база данных и правила синтаксиса. Называются, соответственно, - graph и syntax.

Сетевая база предоставлет средства для извлечения и изменения связей узлов, а также позволяет прикреплять к узлам некоторый набор данных. После нескольких мучительных дней терзаний понял, что этот набор данных является значимой сущностью на более высоких слоях абстракции. Представление его в виде объекта с интерфейсом приводило к усложнению кода. Сначала было два варанта строка для хранения слов и строка для хранения ссылок на файл. (Да-да... Члены предложения могут быть и файлами. И кусками кода, если уж на то пошло.) И эти два интерфейса стали расползаться из глубин хранилища наверх до самого ГУЯ. Вобщем, теперь у узла может быть два значения NULL или строка. Интерпретация строки выполняется за пределами хранилища. Файл можно хранить в виде JSON-чика, в котором указан тип данных и ссылка или путь к файлу. Данные привязываются к узлу в момент создания и не могут быть изменены. По хэшу строки всегда можно найти, привязанный к ней узел. Узлы не удаляются. Причина тому в том, что свзи в базе однонаправленные, и для удаления некоторых узлов пришлось бы долго обходить, возможно, миллионы имеющихся узлов. Ради упрощения и ускорения действует принцип - слово не воробей, вылетит не поймаешь. На самом низком уровне связи хранятся в виде папок и ссылок файловой системы. Простенькие штучки на бесплатном сервере Cloud9 занимают где-то 0,1 секунды. Не плохо бы попробовать замерить на SSD и на машинке помощнее. На нижнем уровне хранилища можно будет задействовать Redis или подключиться к другой базе. Была идея выложить эти папочки со связями узлов в открытый доступ, чтобы можно было скармливать внешним системам как статику.

Правила синтаксиса определяют какие типы узлов могут быть увязаны. Вспомогательная подсистема обеспечивает наличие узлов-признаков типа. Другая подсистема предоставляет возможность запоминать последовательность узлов. В основной системе присутствуют следующие типы:

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

complimnet
Член предложения (кроме сказуемого). Привязывается через валентность к сказуемому и вопросам от него.

argument
Валентность сказуемого. Связывает сказуемое с вопросами, которые можно от него задать.

predicate
Сказуемое. Связано через валентность с вопросительными словами и всевозможными ответами на них в разных предложениях. Буквы сказуемого хранятся в специализированных узлах - словах.

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

answer
Ответ.

word
Слово. Одно и то же слово может содержать ссылку на сказуемое, вопрос и ответ. В английском, например, одно и тоже слово может обозначать как действие, так и предмет. Или ещё для такого случая: "важно не сколько, а как".

Отсутствуют пока что узлы типа reference, которые позволят в качестве ответов использовать подчинённые предложения.

Вся система спроектирована таким образом, чтобы исключить дублирование на лексическом и близких к нему уровнях. Если предложения создаются по-новой, так что в системе может быть несколько одинаковых предложений, то до уровня члена предложения (compliment) узлы не дублируются.

Схема связей такова: