MarkLogic如何通过REST服务或JAVA api约束我的图形查询

时间:2016-12-05 23:15:41

标签: jena marklogic marklogic-8

<?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的查询引擎中。

1 个答案:

答案 0 :(得分:2)

您不想将默认图表加载到客户端,而是希望在setConstrainingQuery()上使用SPARQLQueryDefinition方法。

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

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双时态功能会处理你在时态数据库中遇到的一些困难。