2015-09-18 2 views
2

Я поддерживаю небольшую программу, которая проходит через документы в базе данных Neo4j и выгружает JSON-кодированный объект в базу данных документа. В Neo4j — по соображениям производительности, я думаю, — нет реальных данных, только ID.Алгоритм для рекурсивно связанных объектов

Представьте себе что-то вроде этого:

posts: 
    post: 
     id: 1 
     tags: 1, 2 
     author: 2 
     similar: 1, 2, 3 

Я понятия не имею, почему это было сделано, как это, но это то, что мне приходится иметь дело с. Затем программа использует идентификаторы для извлечения информации для каждой структуры данных, что приводит к правильной структуре. Вместо author это всего лишь int, это объект Author, с именем, адресом электронной почты и т. Д.

Это хорошо работало до тех пор, пока не была добавлена ​​функция similar. Similar состоит из ссылок на другие сообщения. Поскольку в моем цикле я создаю фактические объекты сообщений, как я могу эффективно их использовать? Единственное, что я мог представить, это создать кеш с сообщениями, которые я уже «преобразовал», и, если ссылочный идентификатор не находится в кеше, поместите текущую запись в нижнюю часть списка. В конце концов, все они будут обработаны.

ответ

1

Подход, который вы предлагаете, не будет работать, если существуют циклы similar отношений, которые, вероятно, есть.

Например, вы указали сообщение 1, что похоже на сообщение 2. Предположим, вы сначала столкнулись с постами 1. Он относится к сообщению 2, которого еще нет в кэше, поэтому вы нажимаете сообщение 1 обратно в конец очереди. Теперь вы можете отправить сообщение 2. Он относится к сообщению 1, которого еще нет в кэше, поэтому вы нажимаете сообщение 2 обратно в конец очереди. Это продолжается вечно.

Вы можете решить эту проблему, создав объекты сообщения за два прохода. Во время первого прохода вы делаете объекты Post и заполняете их всей информацией, за исключением ссылок similar, и вы создаете map[int]*Post, который отображает идентификационные номера в сообщениях. На втором проходе, для каждого сообщения, вы перебираете идентификационные номера similar, просматриваете каждый на карте и используете полученные значения *Post, чтобы заполнить []*Post кусочек аналогичных сообщений.

+0

Что делать, если «подобное» поле нуждается в подмножествах структуры Post? Например, меньше полей. Вместо того, чтобы ссылаться, я должен создать картограф? – vinnylinux

+0

Если «похожие» данные представляют собой список значений, я думаю, вы определенно захотите представить значения с помощью среза. То, что вы вкладываете в кусочек, зависит от вас. Например, каждый элемент может быть «map [string] bool', который хранит набор имен полей. –

Смежные вопросы