将图形数据库与关系型数据库连接?

4
我不确定这个问题更适合在这里还是dba.stackexchange.com,如果需要的话请告诉我,我可以移动它。
我正在从头开始启动一个全新的项目,并研究使用图形数据库(在这种情况下可能是neo4j)的适当性。但是,预计该系统将具有适用于图形数据库的数据(例如HR层次结构),以及最好放在RDBMS中的数据(例如订单、发票、产品等)。
我的问题涉及跨越这两个数据库连接的最佳方法。这里有一个简化的例子,我们在图形数据库中有一个销售公司的HR层次结构,在RDBMS中有产品和订单:
层次结构(图形数据库)

Hierarchy (graph database)

订单/产品(关系型数据库管理系统)

Orders/Products (rdbms)

假设我们想找到所有低于“state1”级别的销售员可以获得佣金的订单。
你可以使用两个查询——一个用于从图表中提取所有销售员,第二个用于从关系型数据库管理系统中提取这些销售员的所有订单:
(伪代码)
MATCH (closers:employee)-[member_of]->(:group)<-[parent_of]-(parent:group)
WHERE parent.name = 'state 1'
RETURN closers;

然后将这些结果导入到另一个查询中:

(伪代码)

SELECT * FROM orders WHERE salesEmployeeId IN ( <resultId1>, <resultId2>, ... <resultIdN> );

这个方法能够运行,但在大规模情况下效率较低,且不够优雅。我想直接连接关系型数据库。有没有实现类似功能的方法?
(伪代码)
MATCH (closers:employee)-[member_of]->(:group)<-[parent_of]-(parent:group)
WHERE parent.name = 'state 1'
JOIN rdbms.orders ON orders.salesEmployeeId = closers.id
RETURN orders;

编辑:有人指出,这个问题中的订单部分可以很容易地在图形数据库中实现,因此根本不需要关系型数据库。我已经考虑过这个选项,但目前我仍在努力弄清楚图形数据库是否整体适合。我更感兴趣的是更大、更一般的问题:如果两个系统中都有东西,那么有没有一个好的/快速的/优雅的方法来用一个查询完成这个任务?”

1个回答

3
根据您提供的信息,我认为您的订单数据非常适合在图形数据库中表示。
假设您通过添加以下内容扩展了图形数据库模型(关系类型被省略以增加清晰度):
(e:Employee {id: 123, name: "Foo"})-->(o:Order {id: 234, frozenPrice: 10.99})
(o)-->(c:Customer {id: 345})
(o)-->(i:Item {desc:"Bar", currentPrice:12.99})

然后,您可以像这样非常简单地执行所需的查询:
MATCH (o:Order)<--(closers:Employee)-[member_of]->(:Group)<-[parent_of]-(parent:Group)
WHERE parent.name = 'state 1'
RETURN orders;

这种做法应该更快,而且比尝试使用两个不同的数据库进行单个查询(容易出错)要简单得多。


2
谢谢你,@cybersam。这绝对是我考虑过的一个选项。目前,我仍在努力弄清楚图形数据库将如何适应整个系统。这可能不是最好的例子,因为正如你所指出的那样,订单可以在图形数据库中很好地工作。我更关心的是更大、更普遍的问题:“如果事物同时存在于两个系统中,那么有没有一种好、快、优雅的方式来使用单个查询解决这个问题?” - KOGI

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