AWS Neptune 性能/与 Neo4j AuraDB 比较

AWS Neptune performance / Comparing to Neo4j AuraDB

我们将 Neo4j AuraDB 用于我们的图形数据库,但我们在数据上传方面遇到了问题。因此,我们决定使用迁移工具迁移到 AWS Neptune。

我们的数据库中有 370 万个节点和 1120 万个关系。数据库实例是 db.r5.large,具有 2 个 CPU 和 16GiB RAM。

相同的 AWS Neptune OpenCypher 查询比 AuraDB Cypher 查询慢得多(大约慢 7-10 倍)。此外,我们尝试将查询重写为 Gremlin 并测试性能,但它仍然很慢。我们在 AuraDB 上有节点和查找索引,但我们无法在 AWS Neptune 上创建它们,因为它会自动处理它们。

有什么方法可以在 AWS Neptune 上达到更好的性能吗?

更新:

Gremlin 查询示例: g.V().hasLabel('Member').has('address', eq('${address}')).outE('HAS').as('member_has').inV().as('token').hasLabel('Token').inE('HAS').as('other_member_has').outV().as('other_member').hasLabel('Member').where(__.select('member_has').where(neq('other_member_has'))).select('other_member', 'token').group().by(__.select('other_member').local(__.properties().group().by(__.key()).by(__.map(__.value())))).by(__.fold().project('member', 'number_of_tokens').by(__.unfold().select('other_member').choose(neq('cypher.null'), __.local(__.properties().group().by(__.key()).by(__.map(__.value()))))).by(__.unfold().select('token').count())).unfold().select(values).order().by(__.select('number_of_tokens'), desc).limit(20)

密码查询示例: MATCH (member:Member { address: '${address}' })-[:HAS]->(token:Token)<-[:HAS]-(other_member:Member) RETURN PROPERTIES(other_member) as member, COUNT(token) AS number_of_tokens ORDER BY number_of_tokens DESC LIMIT 20

正如评论中所讨论的那样,截至目前,openCypher 支持是预览版,还不完全是 GA 级别。较新的引擎版本确实有一些重大改进,但还有更多尚未交付。至于 Gremlin 查询,将 Cypher 转换为 Gremlin 的工具往往会构建相当复杂的查询。我认为与 Cypher 查询等效的 Gremlin 看起来像这样。

g.V().has('Member','address', address).as('m').
      out('HAS').hasLabel('Token').as('t').
      in('HAS').hasLabel('Member').as('om').
      where(neq('m')).
      group().
        by('om').
        by(select('t').count()).
      order(local).
        by(values,desc).
      limit(20) 

如果您想要所有属性,只需添加一个 valueMap,如:

g.V().has('Member','address', address).as('m').
      out('HAS').hasLabel('Token').as('t').
      in('HAS').hasLabel('Member').as('om').
      where(neq('m')).
      group().
        by(select('om').valueMap(true)).
        by(select('t').count()).
      order(local).
        by(values,desc).
      limit(20)