我设置了一个 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 来运行这些命令)
WITH
({start:1300542000000,end:1350543000000}) as tr,
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax
CALL ga.timetree.events.range(tr) YIELD node as n
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m
WITH COLLECT(n) as nn, COLLECT(m) as mm
RETURN FILTER(x in nn WHERE X in mm);
我想知道有效过滤这两个语句调用结果的最佳方法是什么。我尝试使用 REDUCE 子句,但无法完全弄清楚语法。
作为一个附带问题,鉴于这是我将向我的数据库发出的最常见的查询类型,这是一种做事的好方法(如使用时间树和 r 树引用同一组节点)?我还没有在 neo4j 中找到任何其他支持在单个结构中同时索引空间和时间的工具,所以这是我当前的实现。