如何在Marklogic中一次查询不同类型文档的图形?

时间:2017-03-02 09:06:05

标签: java graph marklogic marklogic-8 nosql

背景

我第一次使用NoSql数据库支持图表。这是一个处理数千名患者的巨大医疗应用程序。这是一个绿地项目,我们作为一个团队正在努力与我们的持久层。我们不知道如何表示关系,以及我们是否应该使用Triples来处理涉及大量数据的查询。 我们正在使用Java API

数据结构

想象一下,我们的Marklogic数据库中有3种类型的JSON文档:患者,事件,文件证据。

  • 申请中有数千名患者
  • 一名患者可能有多个与该患者相关的事件(入院,出院,转诊,处方药,补充说明,内部状况改变等)。
  • 每个事件都可以附加多个文件作为证据

假设有数十万患者,事件和档案。

问题

是否可以通过一次查询患者的事件和文件?在我们的案例中是否使用语义(可能的三元组:'患者有事件','事件有文件')?

我们的方法

我们尝试使用三元组来提供文档之间的关系,将它们添加到一个图形中,首先使用组合查询来获取IRI,然后在IRI中使用第二个调用获取文档。我们尝试了自定进度的训练并探索https://github.com/marklogic/marklogic-samplestack,但没有运气。那些曾经做过这件事的人并希望分享他的经验会很有帮助。

2 个答案:

答案 0 :(得分:3)

我的情况,请记住,您还可以将三元组存储在每个文档中(推断的主题是文档本身)。然后在您的示例中,您可以将cts:triple-range-query与标准cts:search。

组合在一起

实施例: 如果我有事件并嵌入了三元组,例如[this event-> ownedByPatient - > [IRI /对/ patiens#12345]

然后我可以查询: 搜索由片段过滤的事件,其中cts:triple-range-query声明事件由患者12345拥有

这种方法结合了语义和MarkLogic搜索 - 使用三元组来链接相应的类型。

对于不同类型的文档,三元组并不关心它们所指向的内容 - 一个人的IRI,事件等。它只是关于如何为数据本身建模以及用于描述关系的本体。因此,您也可以将其视为托管三元组(非嵌入式),并将其视为指向您内容的图形数据库(如您所描述的方法)

一旦你走得更远,你也可能决定使用RDF规则强制限制关系类型。

答案 1 :(得分:2)

您向我们提供的信息很少,可以回答这些广泛的问题。尽管如此,我还是会尽力而为。

一个选项是组织数据但是对您来说最直观,并使用服务器端Javascript(SJS)将查询时的文档组合成特定查询所需的任何内容。 SJS可以是resource extensionsearch response transform的形式。资源扩展的优势在于它可以跨不同的文档类型进行多个查询,并将它们拼凑在一起形成答案。另一方面,搜索响应变换将仅给出一个查询的结果,但可以根据需要执行其他查询以引入更多数据。由于您只有数十万条记录,因此您可能不需要过多地强调原始速度。

如果您计划扩展到数百万个文档并希望获得原始速度,您可以在患者记录中保留您想要查询的所有患者。这将允许您通过所有记录的全文搜索以及患者特定数据的字段匹配来查找患者。

假设您想要的唯一搜索结果是患者。如果您需要其他内容,则需要告诉我们您可能需要的其他搜索结果。

当你说"附件"我认为二进制文档包含扫描图像,没有元数据,也没有全文搜索。那些显然将存储为单独的二进制文档。如果他们有元数据或全文,您必须决定是否应该在快速查询的大病人记录中或在单独的文档中。所有"附件"作为单独的JSON文件的文档可以具有通过id指向患者的字段。

我一开始就避免三倍。正如大卫恩尼斯指出的那样,你可以将三元组和搜索结合起来,但它有点像忍者一样。每位患者的一份大型JSON文档对于大多数开发人员来说更容易理解。