如何在Neo4j中有效过滤多个过程调用的结果

如何在Neo4j中有效过滤多个过程调用的结果,neo4j,neo4j-spatial,graphaware,Neo4j,Neo4j Spatial,Graphaware,我设置了一个GraphAware时间树和空间r树来引用我的图中的一大组节点。我试图按时间和空间搜索这些记录 我可以在大约5秒钟内收集这些查询的结果: WITH ({start:1300542000000,end:1350543000000}) as tr CALL ga.timetree.events.range(tr) YIELD node as n RETURN count(n); > ~ 500000 results WITH ({lon:120.0,lat:20.0}) as s

我设置了一个GraphAware时间树和空间r树来引用我的图中的一大组节点。我试图按时间和空间搜索这些记录

我可以在大约5秒钟内收集这些查询的结果:

WITH
({start:1300542000000,end:1350543000000}) as tr
CALL ga.timetree.events.range(tr) YIELD node as n
RETURN count(n);
> ~ 500000 results

WITH
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as n
RETURN count(n);
> ~ 30000 results
当我尝试过滤这些结果时,性能会急剧下降。Neo4j已经在我的系统中占用了大量内存,因此我的印象是,这个命令的内存占用在我的系统中太多,并且查询永远不会完成。(我正在使用neo4j shell来运行这些命令)

我想知道有效过滤这两个语句调用结果的最佳方法是什么。我试图使用REDUCE子句,但无法完全理解语法


作为一个附带问题,考虑到这是我将向数据库发出的最常见的查询类型,这是一种很好的方法吗(如使用时间树和r树引用同一组节点)?我在neo4j中没有发现任何其他工具支持在单个结构中同时对空间和时间进行索引,因此这是我当前的实现。

第一个过程返回500k个节点,而收集是一项代价高昂的操作,因此这将是非常大的内存

我将从返回较少节点的内容开始,然后使用cypher而不是过程,因此在这里,我将用cypher中的范围查询过滤器替换对时间树过程的调用

假设您的节点上有一个索引的
时间戳
属性:

CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m
WITH m 
WHERE m.timestamp > 1300542000000 and m.timestamp < 1350543000000
RETURN m
调用spatial.bbox('spatial_records',smin,smax)将节点生成为m
与m
其中m.timestamp>130054200000和m.timestamp<1350543000000
返回m

我不建议删除时间树(否则我会被炒鱿鱼谢谢你的回复。我确实考虑过进入Java世界,看看我是否可以打自己的电话,根据并行运行的结果或其他东西,以某种方式进行低成本的基于哈希的连接。但老实说,我并不害怕,因为我对Java没有太多的经验我去了apoc图书馆,发现了一些有趣的电话。不知道里面有没有有用的东西。
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m
WITH m 
WHERE m.timestamp > 1300542000000 and m.timestamp < 1350543000000
RETURN m