Neo4j 在 neo4j-sh 中查询 returns 正确的行数,而在 RoR query_as 中 returns 行数加倍

Neo4j query in neo4j-sh returns the right number of rows while query_as in RoR returns double the number of rows

这是我的 类,我正在按照以下位置提供的示例进行操作:https://github.com/neo4jrb/neo4j/tree/master/example/blog 该应用程序目前适用于 CRUD 操作。 这是我的模型 类:

class Post
  include Neo4j::ActiveNode
  property :title
  property :description
  validates :title, presence: true
  index :title
  has_many :out, :comments, rel_class: PostComment
end

class Comment
  include Neo4j::ActiveNode
  property :body
  index :body
  has_one :in, :post, rel_class: PostComment
end

class PostComment
  include Neo4j::ActiveRel
  from_class Post
  to_class Comment
  type 'has_comments'
  property :created_at
end

我有 2 个 Post。 Post 1 有 3 条评论,Post 2 有 1 条评论。总计征求意见。 当我从 neo4j-shell 运行 这个查询时,我得到了正确数量的记录。

neo4j-sh (?)$ start n=node(*) match n-[:has_comments]->(m) return n,m;
4 rows
30 ms

这是正确的。 现在尝试类似形式的 RoR 我得到 8 行而不是 4 行。

2.1.5 :012 >   result = Post.query_as(:post).match("posts-[:has_comments]->(comment:Comment)").pluck(:post, :comment)
2.1.5 :014 > result.count
 => 8

看不出这里有什么问题。任何帮助都感激不尽。

我希望有 6 行,而不是 8 行,但也许我忽略了什么。没关系,真的。不要单独返回 post 和评论,而是尝试返回 postcomment 的集合。你也不需要query_as,你可以通过QueryProxy来完成。

result = Post.as(:post).comments(:comment).pluck(:post, 'collect(comment)')
result.each do |pair|
  post = pair[0]
  comments_array = pair[1]
  comments_array.each do |comment|
    # do things
  end
end

我们很快就会有一个 includes 方法,它会为您自动完成大部分操作,您只需 Post.all.includes(:comments) 然后 post.comments.each 获胜't 导致额外的查询。

另请注意,您在 shell 中写入的匹配项与 gem 将生成的匹配项不同。在 pluck 之前对您的查询调用 to_cypher 以查看它正在构建什么。它自己不包含 return 语句,因此如果您想按原样添加,请将其添加到:RETURN post, comment。 gem 的 Cypher 在最新版本中有点乱,但在下一个版本中会更干净。