【问题标题】:Neo4J search greater than on IndexNeo4J 搜索大于索引
【发布时间】:2015-09-11 06:23:48
【问题描述】:

我有一个包含大量数据集 (~15M) 的 Neo4J 数据库,我想在其中对其一个属性执行大于搜索。我有相应的属性索引。该属性是一个浮点值。

当我进行像MATCH (i:Label) WHERE i.property = $value RETURN count(i) 这样的完全匹配时,我会在很短的时间内得到结果。但是当我使用greater than 进行相同的搜索时,即MATCH (i:Label) WHERE i.property > $value RETURN count(i),它只需要很长时间。在 Cypher 中执行此操作的正确方法是什么?

编辑:执行计划:

+--------------------------------------------+
| No data returned, and nothing was changed. |
+--------------------------------------------+
74 ms

Compiler CYPHER 2.2

Planner COST

EagerAggregation
  |
  +Filter
    |
    +NodeByLabelScan

+------------------+---------------+-------------+------------------------------+    
|         Operator | EstimatedRows | Identifiers |                        Other |
+------------------+---------------+-------------+------------------------------+
| EagerAggregation |          2064 |    count(r) |                              |
|           Filter |       4260557 |           r | r.date > Subtract(Divide(    |
|                  |               |             | TimestampFunction(),{        |  
|                  |               |             | AUTOINT0}),Literal(86400))   |
|  NodeByLabelScan |      14201858 |           r |                     :Request |
+------------------+---------------+-------------+------------------------------+

Total database accesses: ?

【问题讨论】:

标签: neo4j cypher


【解决方案1】:

另一种方法是为该属性创建附加/聚合节点并通过这些节点进行搜索。

示例

假设属性是 0 到 100 之间的值。

创建以下节点
* 0到30
* 31 至 60
* 61到100

创建从您的节点到此“聚合”节点的关系。

比通过那些节点搜索

MATCH (l:Label)-[i:IN]->(a:0to30) 返回 l

【讨论】:

  • 谢谢,这是一个非常棒的意见。有时我太盲目了,看不到明显的东西
【解决方案2】:

不幸的是,Neo4j 在 2.2.x 中没有使用它的索引来处理不等式。在即将到来的 2.3.x 中,这应该会得到支持。

【讨论】:

  • 我期待这样的事情 :( 是否有任何关于何时发布 2.3.x 的信息?
  • 这个功能是否已经在 Milestone 版本中实现了?
  • 计划在 2.3.0-M03 中发布,希望在不久的将来发布。当它发布时,请随意对其进行测试,但请记住,里程碑版本并不能保证在下一个里程碑/候选发布版本发布时为您的数据库提供升级路径。
猜你喜欢
  • 1970-01-01
  • 2014-05-30
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多