2015-10-07 1 views
0

J'ai un utilisateur parlant plusieurs langues. J'écris une requête pour savoir si l'utilisateur parle anglais. Je veux savoir si l'utilisateur parle anglais en cherchant s'il existe une relation entre le nœud utilisateur et le nœud de langue. Je le fais en utilisant rels.to_other ou rels.to_others. Les deux échouent comme décrit ci-dessous. Et BTW quelle est la différence entre les méthodes "to_other" et "to_others"?Neo4j rels.to_other méthode échoue avec erreur

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' 

Pourquoi cette erreur et comment je peux le faire fonctionner?

Répondre

1

rels renvoie immédiatement toutes les relations de ce nœud à ... tout. Il retourne un tableau, d'où l'erreur. Il peut s'agir d'une opération extrêmement lente et nécessitant beaucoup de mémoire si vous avez un nœud avec de nombreuses relations.

En supposant que vous avez une association languages dans votre modèle, vous pouvez faire u.languages.match_to(l).exists? à la place. Il retournera un booléen et ne retournera aucun objet graphique. Vous pouvez également utiliser blank? ou empty?.

+0

u.languages.match_to (l) .existe? NoMethodError: méthode non définie 'existe? ' pour # \t 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 ' – LDB

+0

u.languages.match_to (l) .count N ° de l'utilisateur languages ​​778ms MATCH utilisateur0 WHERE (ID (utilisateur0) = {ID_utilisateur0}) MATCH utilisateur0 - [rel1: 'COMMUNICATING_IN'] -> (result_languages:' Language') O WH (ID (result_languages) = {ID_result_languages}) RETURN nombre (result_languages) AS result_languages ​​| {: ID_user0 => 0,: ID_result_languages ​​=> 3} => 1 – LDB

+0

C'est «existe?», Avec un s. J'ai mis à jour ma réponse pour refléter cela. – subvertallchris