我正在尝试查找人与位置之间存在关系的节点,以及在某个边界框内过滤该位置。
我能够产生我需要的结果,但性能不佳正成为一个问题:
在下面的示例中,我从一个用户开始,找到用户或用户知道的所有位置(最多3个深层关系)已访问过。
START
user = node:USER('username:"testuser"')
MATCH
user-[:KNOWS*0..3]->(users)<-[:VISITED]-place
RETURN
place;
表现很好(<200毫秒)。
一旦我添加空间过滤器,执行时间就会跳到10秒。
START
user = node:USER('username:"testuser"'),
place = node:LOCATION("bbox:[-0.32487837,0.10114981,50.469185,52.508842]")
MATCH
user-[:KNOWS*0..3]->(users)<-[:VISITED]-place
RETURN
place;
空间查询本身返回非常快(<100毫秒),只有当您将这两个启动条件放在一起时,查询才能执行制动。
是否有更好的方法来构建此查询以使其表现更好?
有关使用空间过滤器以及其他索引条件执行查询的任何建议吗?
其他背景: 这是通过Web控制台的Neo4j 1.9.2。 在上面的示例中,来自testuser的0-3级别的用户数是16.宇宙中的位置数是> 1000。边界框内的位置数为933.结果中的最终位数为290.节点本身非常小 - 仅ID和空间数据。整个图表数据库的大小约为7 MB。
更新了查询计划
==> ColumnFilter(symKeys=["users", "user", " UNNAMED6", "place", " UNNAMED5"], returnItemNames=["place"], _rows=2633, _db_hits=0)
==> PatternMatch(g="(user)-[' UNNAMED5']-(users)", _rows=2633, _db_hits=0)
==> Nodes(name="user", _rows=13281, _db_hits=13281)
==> TraversalMatcher(trail="(place)-[ UNNAMED6:VISITED WHERE true AND true]->(users)", _rows=13281, _db_hits=14214)
==> ParameterPipe(_rows=1, _db_hits=0)
我重建图形,调整内存,关闭所有其他正在运行的应用程序,将其移动到速度更快的服务器并将其降低到2秒。在生产场景中,数据将增长2位有效数字,但这确实需要在1/10秒的空间内......