Neo4j Cypher查询 - 开始和结束节点的索引查找

时间:2013-07-28 18:10:22

标签: neo4j geospatial cypher

我正在尝试查找人与位置之间存在关系的节点,以及在某个边界框内过滤该位置。

我能够产生我需要的结果,但性能不佳正成为一个问题:

在下面的示例中,我从一个用户开始,找到用户或用户知道的所有位置(最多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秒的空间内......

0 个答案:

没有答案