【问题标题】:MarkLogic how can I constrain my graph query through REST service or JAVA apiMarkLogic 如何通过 REST 服务或 JAVA api 约束我的图形查询
【发布时间】:2016-12-05 23:15:40
【问题描述】:

<?xml  version="1.0" encoding="UTF-8"?>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
  <start-time xmlns="http://abc.com.au/meta#">2016-12-08T17:19:59.220366+11:00</start-time>
  <stop-time xmlns="http://abc.com.au/meta#">2999-12-31T00:00:00+11:00</stop-time>
  <sem:triple>
    <sem:subject>http://abc.au/abc/abc/Model#abc</sem:subject>
    <sem:predicate>http://abc.com.au/core/abc#minOccurs</sem:predicate>
    <sem:object datatype="http://www.w3.org/2001/XMLSchema#string">0</sem:object>
  </sem:triple>
</sem:triples>

MarkLogic 提供 Java API 来使用其 URI 加载语义图。 API 向 MarkLogic 发送 HTTP 请求以检索图形。但是,目前请求参数仅包含图形 URI,而没有其他内容。我们想通过一些范围约束来约束我们的图形加载。我们在 MarkLogic 中使用了embedded triples,并带有一些额外的时间戳来标识三元组的版本。当我们通过 REST 服务加载图形时,我们有没有办法在 HTTP 请求中将时间戳指定为范围约束?我们只需要加载匹配时间戳约束的部分图表。

我们想要将三元组加载为图表的原因是我们想要将它与 Apache Jena 一起使用。为了使用 Jena 执行 SPARQL,我们首先需要将图作为 RDF 模型加载到 Jena 的查询引擎中。

【问题讨论】:

  • 你在使用github.com/marklogic/marklogic-jena吗?这些 REST 端点中的哪一个:docs.marklogic.com/REST/GET/v1/graphs?其中一些接受结构化查询参数,该参数适用于嵌入这些三元组的文档..
  • 您的场景听起来很有趣,我认为答案是“是的,您可以这样做”,但我不完全理解。您可以粘贴嵌入了三元组的文档吗?如果将这样的文档存储在 MarkLogic 中,Jena 可以毫无问题地查询其中的三元组。
  • @grtjn 是的,我正在使用该包装器。该包装器的问题在于,每次调用“toDataset()”方法以启动 sparql 查询时,它只是调用 marklogic java api 来加载整个图并将图加载到 Jena 中,这样 sparql 查询就可以对模型执行。我已经深入研究了 marklogic java api,我知道它正在调用“/V1/graphs”端点。但是,此端点似乎不支持指定除图形 URI 之外的其他查询参数。我想通过指定时间范围来限制图形三元组的加载。
  • @grechaw 我上传了一个示例文档,您可以在其中看到开始时间和结束时间。在 Marklogic 中,我们使用 ctx 函数通过在执行 sparql 查询时咨询这两个参数来限制时间范围。在 Jena 中,在执行 sparql 查询之前,我们想先从 Marklogic 加载图模型。那么在 Marklogic 的 Java 客户端 API 中,我们是否有办法加载一个只有与我们指定的时间范围相匹配的三元组的图?目前,当我调用“MarklogicDatasetGraph.toDataset().getDefaultModel()”时,无论时间戳如何,它都会返回一个完整的图表。

标签: jena marklogic marklogic-8


【解决方案1】:

您需要在SPARQLQueryDefinition 上使用setConstrainingQuery() 方法,而不是将默认图形加载到客户端。

假设你在元素 {"http://abc.com.au/meta#}start-time 上有一个 dateTime 类型的范围索引,那么你可以这样做:

SPARQLQueryManager sparqlQueryManager;

StructuredQueryBuilder qb = new StructuredQueryBuilder();
StructuredQueryDefinition structuredQuery = qb.and(
   qb.range(qb.element(new QName("http://abc.com.au/meta#", "start-time")), EvalResult.Type.DATETIME, StructuredQueryBuilder.Operator.GE, value),
   qb.range(qb.element(new QName("http://abc.com.au/meta#", "end-time")), EvalResult.Type.DATETIME, StructuredQueryBuilder.Operator.LE, value));
SPARQLQueryDefinition sparql = sparqlQueryManager.newQueryDefinition("select ...");
sparql.setConstrainingQueryDefinition(structuredQuery);
JsonNode results = sparqlQueryManager.executeSelect(sparql, new JacksonHandle()).get();

但是,您似乎正在尝试对时间性做一些事情——MarkLogic 双时间性功能可以解决您在使用时间性数据库时遇到的一些难题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多