3

我设置了一个 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 中找到任何其他支持在单个结构中同时索引空间和时间的工具,所以这是我当前的实现。

4

1 回答 1

2

第一个过程返回 500k 节点,收集是一项昂贵的操作,所以是的,这将非常占用内存。

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

假设您的节点上有一个索引属性: timestamp

CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m
WITH m 
WHERE m.timestamp > 1300542000000 and m.timestamp < 1350543000000
RETURN m

我不建议删除时间树(否则我会被解雇<- 笑话)。在某些时间查询情况下,时间树的性能会优于范围查询的查询,尤其是当分辨率很高(毫秒)并且您有很多非常连续的时间戳时。

否则你似乎有一个非常好的用例,如果你可以发送更多关于 neo4j slack 的详细信息或私下(graphaware dot com 的 christophe),这将有助于 Neo4j 和 GraphAware 通过程序支持更多的东西(比如以更好的方式传递节点集合并过滤掉那些不在范围内或与空间平滑组合的节点,只要它足够通用。

同时,当您使用开源产品时,您可以轻松地创建一个程序,为您的特定用例组合两个程序。

于 2016-08-01T21:18:21.910 回答