Benjamin Scharbau
Benjamin Scharbau

Reputation: 2089

Neo4J search greater than on Index

I have a Neo4J database with a large number of datasets (~15M), where I want to perform a greater than search on one of its properties. I have the corresponding property indexed. The property is a float value.

When I do an exact match like MATCH (i:Label) WHERE i.property = $value RETURN count(i) I get the result within a very short time. But when I do the same search with greater than, i.e. MATCH (i:Label) WHERE i.property > $value RETURN count(i) it just takes forever. What is the correct way to do this in Cypher?

Edit: Execution plan:

+--------------------------------------------+
| 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: ?

Upvotes: 3

Views: 666

Answers (2)

MicTech
MicTech

Reputation: 45083

Another approach is to create additional/aggregation nodes for that property and searching thru those nodes.

Example

Let say the property is a value from 0 - 100.

Create following nodes
* 0to30
* 31to60
* 61to100

Create relationship from you nodes to this 'aggregate' nodes.

Than searching thru those nodes

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

Upvotes: 1

Brian Underwood
Brian Underwood

Reputation: 10856

Unfortunately Neo4j doesn't use it's indexes for inequalities in 2.2.x. In the upcoming 2.3.x this should be supported.

Upvotes: 1

Related Questions