Neo4j & Neography - получить результаты запроса шифра в объекте hash/openstruct

Я использую потрясающий гем neography и столкнулся с небольшой проблемой преобразования результатов запроса Cypher в структурированный объект (OpenStruct.new...)

Я не знаю, как создать хэш или OpenStruct из столбцов и результатов запроса данных, которые

{"columns"=>["p.pd_challenge_id", "p.author_id"], "data"=>[["158", "88"], ["158", "90"], ["158", "99"], ["158", "95"], ["158", "97"]]}

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

["data"].map{|x|{ "challenge_id" => x[1],"author_id"=>x[0]}}.to_json

приводит к

{{"challenge_id":158, "author_id":88}, {"challenge_id":158, "author_id":90}, {"challenge_id":158, "author_id":99}}    etc..   (to which I simply cannot convert to a hash or openstruct)

То, что я ищу, - это что-то вроде следующего, хранящегося в объекте структуры, чтобы представление с каркасом могло читать его без изменений:

{:challenge_id=>158, :author_id=>88}
{:challenge_id=>158, :author_id=>90}
{:challenge_id=>158, :author_id=>99}

мое представление будет искать object.challenge_id

Теперь я безуспешно пытался использовать to_sym для «challenge_id» при использовании метода .map.

Я пытался хешировать [@mydata] на ["data"], но это тоже не работает.

Есть ли простой способ получить все эти данные в структурированный объект (OpenStruct.new .. ), чтобы мои формы могли просто читать их, как если бы они читали результаты запроса активной записи? Я могу сделать это с помощью neo.get_node_properties, но просто не могу заставить это работать правильно.


person Ruben Catchme Obregon    schedule 04.04.2013    source источник


Ответы (1)


Допустим, у вас есть два узла с именем и заголовком.

cypher = "start n = node(1,2) return n.name as name, n.title as title"
results = @neo.execute_query(cypher)
{"columns"=>["name", "title"], "data"=>[["Marc", "awesome"], ["Tom", "chief"]]} 

Затем вы берете свои результаты и делаете следующее:

array_of_hashes = results["data"].map {|row| Hash[*results["columns"].zip(row).flatten] }

Что оставит вас с:

[{"name"=>"Marc", "title"=>"awesome"}, {"name"=>"Tom", "title"=>"chief"}]

Вы можете остановиться здесь или...

objects = array_of_hashes.map{|m| OpenStruct.new(m)}

[#<OpenStruct name="Marc", title="awesome">, #<OpenStruct name="Tom", title="chief">]

Который вы можете затем получить доступ

objects.first.name => "Марк"

person Max De Marzi    schedule 04.04.2013
comment
Макс - это отличный ответ, но как насчет нулевых значений? Когда данные содержат их, результирующая структура не выровнена - данные находятся в неправильных столбцах. Любой способ сохранить нулевые значения? - person Ruben Catchme Obregon; 09.05.2013