如何在neo4j中运行批量事务

4

我们正在生产环境中开发一个推荐引擎应用。

我们需要根据地理位置(最近的优先)对产品进行排序,我们考虑利用空间函数如距离和点来对它们进行排序。为此,我们需要在产品节点中具有经度和纬度属性,但我们还没有,我们只有邮政地址。因此,我们决定使用call apoc.spatial.geocodeOnce来获取并设置所有产品节点中的经度和纬度属性。

然而,我们遇到了一些问题,这是一项昂贵的操作,我们大约有5000个产品节点,每个节点平均需要1000毫秒来更新。根据此计算,在单个核心上,需要大约90分钟才能更新所有节点。我们想知道是否有更聪明的方法来以分块方式处理事务(也许每次更新500个产品,然后更新下一个500个...等等)。我们认为apoc.periodic.iterate是解决这个问题的一种方法,但我们正在寻求关于如何高效解决此问题的建议?

P.S- 当我们尝试对我们数据库中具有邮政地址的几个产品执行一些apoc.spatial.geocodeOnce调用时,我们发现有几个调用没有返回结果,可能出现了什么问题?(也许我们没有标准化这些产品的邮政地址?如果是这样,我们应该如何解决这个问题,我们应该为这些产品使用google geocode API还是neo4j中有其他更智能的方法)。

以下是我们的查询供参考:

CALL apoc.periodic.iterate( "MATCH (p:Product) return p", "CALL apoc.spatial.geocodeOnce(p.postal_address) YIELD location SET p.latitude=location.latitude, p.longitude=location.longitude", {batchSize:500, iterateList:true, parallel:true} )

1个回答

1
由于apoc.spatial.geocodeOnce API调用的限制,导致了这种情况。服务器上有一个请求次数的速率限制器。
您可以购买谷歌地理编码API密钥,并在apoc.conf文件中进行配置,例如:
apoc.spatial.geocode.provider=google
apoc.spatial.geocode.google.throttle=1
apoc.spatial.geocode.google.key={YOUR_API_KEY}

注意 - 这里的节流是以毫秒为单位的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接