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 和评论,而是尝试返回 post
和 comment
的集合。你也不需要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 在最新版本中有点乱,但在下一个版本中会更干净。
这是我的 类,我正在按照以下位置提供的示例进行操作: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 和评论,而是尝试返回 post
和 comment
的集合。你也不需要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 在最新版本中有点乱,但在下一个版本中会更干净。