【发布时间】:2017-09-29 09:22:29
【问题描述】:
将银行账户上的简单交易想象为图形数据库。像这样的事件:
- +$1000 现金投入。
- -10 美元 通过 VISA 购买一本书。
- +100 美元 出售旧自行车的现金。
- -50 美元 购买杂货的现金。
在图结构中,我们可以将节点定义为具有以下属性的事务:
- id - 交易 ID
- time - 交易发生时间的时间戳。
- delta - 交易中使用的金额 (+/-)
- 描述 - 交易原因。
边将指向上一个事务。我们可以让其他边指向其他账户(用于账户之间的转账)、所有者等,但为简单起见,我们有这种结构。
g.addV('transactions').property('id','1').property('time',0).property('delta',1000).property('description','cash input')
g.addV('transactions').property('id','2').property('time',1).property('delta,-10).property('description','for buying a book by VISA')
g.V('2').addE('previous').to(g.V('1'))
g.addV('transactions').property('id','3').property('time',2).property('delta',100).property('description','cash for selling an old bike.')
g.V('3').addE('previous').to(g.V('2'))
g.addV('transactions').property('id','4').property('time',3).property('delta',-50).property('description','cash for buying groceries')
g.V('4').addE('previous').to(g.V('3'))
现在要获取此帐户的当前库存,我们只需遍历从最新交易到特定日期或开始的上一个边,如下所示:
g.V('4').emit().repeat(out('previous')).until(has('time',0)).properties('delta').value().sum()
==>1040
对于 4 次交易来说,这一切都很好而且很快。但是,为 100 000 个事务执行此操作时,大约需要 8 分钟,而对于更复杂的操作或更多数据,则需要更长的时间。
在我的测试用例中,我设置了一个带有 Graph API 的 Azure Cosmos-DB,吞吐量为 2000 RU/s。
由于我对 Graph 数据库和查询还很陌生,我意识到可能有更快更好的方法来做到这一点,以及优化这一点的方法,我不知道。也许甚至图形数据库也不是这项工作的正确工具?
我想在这里实现的是对交易的合理快速查询,这可能会分叉到多个账户和更多事件。
我怎样才能更好地完成这项工作?
【问题讨论】:
标签: graph-databases gremlin azure-cosmosdb tinkerpop azure-ad-graph-api