Хранение сериализованных данных в объекте в Neo4j

#arrays #serialization #neo4j

#массивы #сериализация #neo4j

Вопрос:

Я только что перенес свое приложение Rails с MySQL на Neo4j. Я сохранял список пользовательских веб-сайтов в виде сериализованной строки в своей базе данных (например. User.websites = «www.facebook.com «,»www.twitter.com «и т.д.)

Когда я пытаюсь создать или обновить этот атрибут, я получаю следующую ошибку:

Ошибка выполнения (не разрешено хранить массив со значением…

Каков наилучший способ хранения массива или сериализованных данных в Neo4j?

Ответ №1:

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

В случае 1, то есть в случае, если вы являетесь значимыми элементами вашей модели. Я рекомендую иметь что-то вроде этого User —[related_to] —> Website(url: строка)

В случае 2 они могут быть просто массивом строк внутри пользовательского узла. Как вы можете видеть в документации по API Neo4j, вы можете сохранять в качестве свойств следующий набор типов:

  • логическое значение или логическое значение []
  • байт или байт[]
  • короткое или короткое []
  • int или int[]
  • длинный или длинный[]
  • плавающий или плавающий []
  • double или double[]
  • символ или символ[]
  • java.lang.Строка или строка[]

    • purbon

Комментарии:

1. Это случай № 2. Есть ли способ легко сериализовать / десериализовать строки в массив в Neo4j? ActiveRecord имеет метод «serialize» для этой самой функции…

2. не совсем. вы можете посмотреть, предоставляет ли neo4j gem что-то более похожее на ActiveRecord. Но не уверен.

3. Привет, я обычно предпочитаю случай 1, поскольку он дает вам больше гибкости. Обратите внимание, что вы можете сохранять элементы в виде списка (has_list), если порядок элементов имеет значение. Neo4j.rb поддерживает случай 2. если вы хотите сохранить массив примитивных значений (String, int, byte и т.д.), Просто убедитесь, что все элементы в массиве имеют один и тот же тип.

4. Проверьте это, если вы хотите сериализовать объекты в примитивы — neo4j.rubyforge.org/Neo4j/TypeConverters.html или сопоставление значений объектов — neo4j.rubyforge.org/Neo4j/Rails/Compositions/ClassMethods.html (точно так же, как ActiveRecord)

Ответ №2:

В дополнение к обсуждению выше, вот пример способа сериализации ( http://gist.github.com/1674551 )

neo4jhelpers.rb

 module Neo4j
  module TypeConverters
    class SerializeConverter
      # serializes to sting
      class << self

        def convert?(type)
          type == :serialize
        end

        def to_java(value)
          return nil unless value
          JSON.generate(value).to_s
        end

        def to_ruby(value)
          return nil unless value
          JSON.parse(value.to_s)
        end
      end

    end
  end
end

Neo4j::TypeConverters.converters = nil # reload converters