提高在Neo4j Spatial中寻找最近节点的性能

时间:2016-06-12 13:26:04

标签: neo4j neo4j-spatial

我的目标是通过给定的经度和经度找到最近的节点。我创建了简单点层,我使用findClosestGeometies查询,但响应时间,即使数据库相对较小,也相当不令人满意。我执行以下操作来创建我的图层:

:POST /db/data/ext/SpatialPlugin/graphdb/addSimplePointLayer { 
    "layer" : "layerName", 
    "lat" : "NODE_LAT", 
    "lon" : "NODE_LON" 
}

:POST /db/data/index/node {"name":"layerName", "config": 
  {"provider":"spatial", "geometry_type":"point", "lat":"NODE_LAT", "lon":"NODE_LON"}
}

match(n:WAY_NODE) set n.id=ID(n);

然后使用简单的java程序,我在图层中添加了~70k节点并运行了示例查询:

:POST db/data/ext/SpatialPlugin/graphdb/findClosestGeometries { 
    "pointX" : 18.5640344020454,
    "pointY" : 54.4441138296926,
    "distanceInKm" : 1.0, 
    "layer" : "layerName" 
}

它正常工作,但每个响应大约需要8秒钟。有没有办法加快速度?任何想法我应该使用什么?

1 个答案:

答案 0 :(得分:0)

如果提供的 String currentUserObjectId = Backendless.UserService.loggedInUser(); if (currentUserObjectId != null && currentUserObjectId.length() > 0) { try { BackendlessDataQuery dataQuery = new BackendlessDataQuery(); dataQuery.setWhereClause("objectId = '" + currentUserObjectId + "'"); Backendless.Persistence.of(BackendlessUser.class).find(dataQuery, new AsyncCallback<BackendlessCollection<BackendlessUser>>() { @Override public void handleResponse(BackendlessCollection<BackendlessUser> response) { List<BackendlessUser> users = response.getCurrentPage(); if (users != null && users.size() > 0) { BackendlessUser user = users.get(0); try { Backendless.UserService.setCurrentUser(user); } catch (BackendlessException e) { ... } ... 参数中有很多地方,我也会观察到相当差的表现。

我的解决方法是从一个相当小的距离值开始。如果该范围内没有结果,请再次尝试。