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

How to query a graph of documents of different types at once in Marklogic?

背景

我第一次使用支持图表的NoSql数据库。这是一个处理数千名患者的庞大医疗应用程序。这是一个全新的项目,我们作为一个团队正在为我们的持久层而苦苦挣扎。我们不知道关系应该如何表示,也不知道我们是否应该使用三元组来处理涉及大量数据的查询。 我们正在使用 Java API.

数据结构

假设我们的 Marklogic 数据库中有 3 种类型的 JSON 文档:患者、事件、文件证据。

假设有数十万患者、事件和文件。

问题

是否可以一次查询带有事件和文件的患者?在我们的案例中是否推荐使用语义(可能的三元组:'patient has event'、'event has file')?

我们的方法

我们尝试使用三元组来提供文档之间的关系,将它们添加到一个图中,使用组合查询首先获取 IRI,然后在第二次调用中通过 IRI 获取文档。我们尝试了自定进度的培训和探索 https://github.com/marklogic/marklogic-samplestack,但没有成功。过去曾这样做过并愿意分享他的经验的人的帮助会很棒。

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

结合使用

示例: 如果我有事件并嵌入了一个三元组,例如 [this event-> ownedByPatient -> [iri/for/patiens#12345]

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

所有

这种方法结合了语义和 MarkLogic 搜索 - 使用三元组 link 适当的类型。

至于不同类型的文档,三元组不关心它们指向什么——一个人、事件等的 IRI。它只是关于你如何建模你的数据本身和 ontology 用于描述关系。因此,您也可以将其作为托管三元组(非嵌入式)来处理,并将其全部视为指向您的内容的图形数据库(就像您描述的方法一样)

进一步了解后,您还可以决定使用 RDF 规则对关系类型施加限制。

您给我们提供的信息很少,无法回答如此广泛的问题。不过,你给的,我会尽力的。

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

如果您计划扩展到数百万个文档并想要原始速度,您可以在患者记录中保留您想要查询的关于一位患者的所有内容。这将允许您通过对他们所有记录的全文搜索加上患者特定数据的字段匹配来找到患者。

假设您唯一想要的搜索结果是患者。如果您想要其他东西,您需要让我们知道您可能想要的其他搜索结果。

当您说 "attachment" 时,我想到了带有扫描图像的二进制文档,没有元数据,也没有可供搜索的全文。这些显然会存储为单独的二进制文件。如果他们有元数据或全文,您将必须决定是将其中的任何内容放在大型患者记录中以便快速查询还是放在单独的文档中。所有 "attachment" 个单独 JSON 文件的文档都可以有一个通过 id 指向患者的字段。

一开始我会避免三元组。正如 David Ennis 指出的那样,您可以将三元组和搜索结合起来,但这有点像忍者之举。对于大多数开发人员来说,每位患者一份大 JSON 文档更容易理解。