Neo4j rels.to_other方法失败并出现错误

时间:2015-10-07 23:02:52

标签: neo4j neo4j.rb

我有一个用户说几种语言。 我正在写一个查询,以查明用户是否会说英语。 我想通过搜索用户节点和语言节点之间是否存在关系来查明用户是否说英语。 我这样做是使用rels.to_other或rels.to_others。两者都失败,如下所述。而BTW" 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'

为什么会出现此错误以及如何使其发挥作用?

1 个答案:

答案 0 :(得分:1)

rels立即返回从该节点到...所有内容的所有关系。它返回一个数组,因此返回错误。如果您的节点有很多关系,那么它可能是一个极其缓慢的内存密集型操作。

假设您的模型中有languages个关联,您可以改为u.languages.match_to(l).exists?。它将返回一个布尔值,并且不返回任何图形对象。您还可以使用blank?empty?