Метод Neo4j rels.to_other завершается с ошибкой

У меня есть пользователь, говорящий на нескольких языках. Я пишу запрос, чтобы узнать, говорит ли пользователь по-английски. Я хочу узнать, говорит ли пользователь по-английски, выполнив поиск, существует ли связь между узлом пользователя и узлом языка. Я делаю это, используя rels.to_other или rels.to_others. Оба терпят неудачу, как описано ниже. И кстати, в чем разница между методами «to_other» и «to_others»?

irb(main):105:0> u
=> #<User uuid: "b1461edd-a574-44a7-9555-68659a361be2", created_at: Tue, 06 Oct 2015 16:21:26 +0000, name: "Levi Damian", type: "Regular", updated_at: Tue, 06 Oct 2015 16:21:26 +0000>

irb(main):106:0> l
=> #<Language uuid: "e388eb70-66b2-4b20-8f15-6ca11b34d03d", name: "English">

irb(main):107:0> u.rels.to_other(l)
 CYPHER 802ms MATCH n, (n)-[r]-(p) WHERE (ID(n) = {ID_n}) RETURN r as result | {:ID_n=>38}
NoMethodError:  CYPHER 125ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>38}
 CYPHER 125ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>43}
 CYPHER 125ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>38}
 CYPHER 124ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>42}
 CYPHER 128ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>38}
 CYPHER 130ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>41}
 CYPHER 124ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>38}
 CYPHER 125ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>86}
 CYPHER 124ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>38}
 CYPHER 129ms MATCH n WHERE (ID(n) = {ID_n}) RETURN n | {:ID_n=>87}
undefined method `to_other' for #<Array:0x007fedc2d6b980>
    from (irb):107
    from /Users/levi/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/railties-4.2.4/lib/rails/commands/console.rb:110:in `start'

Почему эта ошибка и как я могу заставить ее работать?


person LDB    schedule 07.10.2015    source источник


Ответы (1)


rels немедленно возвращает все отношения из этого узла... ко всему. Он возвращает массив, следовательно, ошибка. Это может быть чрезвычайно медленной операцией с интенсивным использованием памяти, если у вас есть узел со многими отношениями.

Предполагая, что в вашей модели есть ассоциация languages, вместо этого вы можете использовать u.languages.match_to(l).exists?. Он вернет логическое значение и не вернет никаких графических объектов. Вы также можете использовать blank? или empty?.

person subvertallchris    schedule 08.10.2015
comment
u.languages.match_to(l).существует? NoMethodError: неопределенный метод exist?' for #<Neo4j::ActiveNode::Query::QueryProxy:0x007f8b648ced98> from /Users/levi/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/neo4j-5.2.9/lib/neo4j/active_node/query/query_proxy.rb:232:in method_missing' - person LDB; 09.10.2015
comment
u.languages.match_to(l).count User#languages ​​778ms MATCH user0 WHERE (ID(user0) = {ID_user0}) MATCH user0-[rel1:COMMUNICATING_IN]-›(result_languages:Language) WHERE (ID(result_languages) = { ID_result_languages}) RETURN count(result_languages) AS result_languages ​​| {:ID_user0=›0, :ID_result_languages=›3} =› 1 - person LDB; 09.10.2015
comment
Это exists? с буквой s. Я обновил свой ответ, чтобы отразить это. - person subvertallchris; 09.10.2015
comment
На этот раз это сработало идеально. Однако это не возвращает все отношения, которые пользователь имеет для каждого языка, на котором он говорит. Он возвращает true или false только в том случае, если пользователь говорит на каком-либо языке. Как я могу восстановить, если пользователь (я) говорю также по-немецки и по-французски? Я должен получить массив отношений, указывающих от использования (меня) к каждому языку, на котором я говорю, в моем случае 3 отношения. - person LDB; 13.10.2015
comment
Это немного другое. Если вы хотите вернуть все отношения, u.languages.each_rel или u.languages(:l, :r).pluck(:r) сделают это. - person subvertallchris; 13.10.2015