Neo4j.rb - 不能使用排序方式
Neo4j.rb - Can't use order by
我有 3983 个 BISAC 类型的节点。
我无法使用 order by 检索它们。
这是有效的:
irb(main):024:0* bc = Bisac.all
=> <QueryProxy CYPHER: "MATCH (n:`Bisac`)">
irb(main):025:0> bc.count
CYPHER 796ms MATCH (n:`Bisac`) RETURN count(n) AS n
=> 3983
irb(main):026:0> bc.first
CYPHER 129ms MATCH (n:`Bisac`) RETURN n ORDER BY n.uuid LIMIT {limit_1} | {:limit_1=>1}
=> #<Bisac uuid: "d1c60f13-3c70-11e5-8eb8-22000b18b199", bisac_code: "MUS037050", bisac_value: "MUSIC / Printed Music / Mixed Collections">
irb(main):027:0> bc.last
CYPHER 127ms MATCH (n:`Bisac`) RETURN n ORDER BY n.uuid LIMIT {limit_1} | {:limit_1=>1}
=> #<Bisac uuid: "d1c60f13-3c70-11e5-8eb8-22000b18b199", bisac_code: "MUS037050", bisac_value: "MUSIC / Printed Music / Mixed Collections">
当尝试使用命令时失败如下:
irb(main):033:0* bc = Bisac.order('bisac_code')
=> <QueryProxy CYPHER: "MATCH (result_bisac:`Bisac`) ORDER BY bisac_code">
irb(main):034:0> bc.count
CYPHER 790ms MATCH (result_bisac:`Bisac`) RETURN count(result_bisac) AS result_bisac
=> 3983
irb(main):035:0> bc.first
CYPHER 364ms MATCH (result_bisac:`Bisac`) WITH result_bisac ORDER BY bisac_code RETURN HEAD(COLLECT(result_bisac)) as result_bisac
Neo4j::Session::CypherError: bisac_code not defined (line 1, column 57 (offset: 56))
"MATCH (result_bisac:`Bisac`) WITH result_bisac ORDER BY bisac_code RETURN HEAD(COLLECT(result_bisac)) as result_bisac"
^
from /Users/levi/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/neo4j-core-5.0.10/lib/neo4j-server/cypher_response.rb:211:in `raise_cypher_error'
这里有什么问题?
我的宝石是:
neo4j (5.0.14)
neo4j-核心 (5.0.10)
是的,我实际上可以立即解释的事情! ;)
所以 ORDER BY
不在计数中的原因是因为它只会减慢您的 count
并且永远不会 return 不同的结果。
至于 .order
,原因是您传递的是 String
而不是 Symbol
。因为 Cypher 是一种比 SQL 更动态的查询语言,所以我一度决定以不同的方式对待字符串和符号。这个想法是,如果您指定一个字符串,您可能希望指定一个更动态的 ORDER BY
子句,而通常您会使用一个符号来指定您想要作为排序依据的 属性。这实际上是在 neo4j-core
Query
API 中实现的,但它会影响 neo4j
gem.
中的 ActiveNode
所以答案是:
bc = Bisac.order(:bisac_code)
bc.first
也就是说,这确实应该记录在案,并可能变得更智能。我会创建一个问题,谢谢!
我有 3983 个 BISAC 类型的节点。 我无法使用 order by 检索它们。 这是有效的:
irb(main):024:0* bc = Bisac.all
=> <QueryProxy CYPHER: "MATCH (n:`Bisac`)">
irb(main):025:0> bc.count
CYPHER 796ms MATCH (n:`Bisac`) RETURN count(n) AS n
=> 3983
irb(main):026:0> bc.first
CYPHER 129ms MATCH (n:`Bisac`) RETURN n ORDER BY n.uuid LIMIT {limit_1} | {:limit_1=>1}
=> #<Bisac uuid: "d1c60f13-3c70-11e5-8eb8-22000b18b199", bisac_code: "MUS037050", bisac_value: "MUSIC / Printed Music / Mixed Collections">
irb(main):027:0> bc.last
CYPHER 127ms MATCH (n:`Bisac`) RETURN n ORDER BY n.uuid LIMIT {limit_1} | {:limit_1=>1}
=> #<Bisac uuid: "d1c60f13-3c70-11e5-8eb8-22000b18b199", bisac_code: "MUS037050", bisac_value: "MUSIC / Printed Music / Mixed Collections">
当尝试使用命令时失败如下:
irb(main):033:0* bc = Bisac.order('bisac_code')
=> <QueryProxy CYPHER: "MATCH (result_bisac:`Bisac`) ORDER BY bisac_code">
irb(main):034:0> bc.count
CYPHER 790ms MATCH (result_bisac:`Bisac`) RETURN count(result_bisac) AS result_bisac
=> 3983
irb(main):035:0> bc.first
CYPHER 364ms MATCH (result_bisac:`Bisac`) WITH result_bisac ORDER BY bisac_code RETURN HEAD(COLLECT(result_bisac)) as result_bisac
Neo4j::Session::CypherError: bisac_code not defined (line 1, column 57 (offset: 56))
"MATCH (result_bisac:`Bisac`) WITH result_bisac ORDER BY bisac_code RETURN HEAD(COLLECT(result_bisac)) as result_bisac"
^
from /Users/levi/.rbenv/versions/2.2.1/lib/ruby/gems/2.2.0/gems/neo4j-core-5.0.10/lib/neo4j-server/cypher_response.rb:211:in `raise_cypher_error'
这里有什么问题?
我的宝石是: neo4j (5.0.14) neo4j-核心 (5.0.10)
是的,我实际上可以立即解释的事情! ;)
所以 ORDER BY
不在计数中的原因是因为它只会减慢您的 count
并且永远不会 return 不同的结果。
至于 .order
,原因是您传递的是 String
而不是 Symbol
。因为 Cypher 是一种比 SQL 更动态的查询语言,所以我一度决定以不同的方式对待字符串和符号。这个想法是,如果您指定一个字符串,您可能希望指定一个更动态的 ORDER BY
子句,而通常您会使用一个符号来指定您想要作为排序依据的 属性。这实际上是在 neo4j-core
Query
API 中实现的,但它会影响 neo4j
gem.
ActiveNode
所以答案是:
bc = Bisac.order(:bisac_code)
bc.first
也就是说,这确实应该记录在案,并可能变得更智能。我会创建一个问题,谢谢!