是否有可能在SPARQL中获取嵌套的json输出?

时间:2018-07-30 06:28:05

标签: sparql marklogic

我正在使用MarkLogic 8.0-6.3

我遇到了需要在SPARQL中嵌套JSON输出的情况。

例如,IRI有多个相同的谓词,结果我希望数组中的多个值不作为一个整体三元组。

例如:

假设三元组:

@prefix p0: <http://www.mla.com/term/> .
p0:7 <http://www.w3.org/2004/02/skos/core#narrower> p0:768 ,
                                                    p0:769 ,
                                                    p0:770 ,
                                                    p0:771 .

SPARQL查询:

PREFIX skos-mla: <http://www.mlacustom.com#>
PREFIX term: <http://www.mla.com/term/>

select ?iri ?o {   
    graph<thesaurus-term>{         
        bind(term:7 as ?iri)
        term:7 skos:narrower ?o .
    }
}

上面的查询将返回4个三元组作为输出。

我想要的是它应该只返回一个像

这样的json结构
{
    "iri": "http://www.mla.com/term/7",
    "narrowers": ["http://www.mla.com/term/768", "http://www.mla.com/term/769", "http://www.mla.com/term/770", "http://www.mla.com/term/771"]
}

以上JSON只是为了解释问题。 实际上,我需要一个更复杂的json结构,而不是字符串数组,而需要一个json对象数组。

我知道我可以读取响应并以任何格式重新创建整个json,但这会影响性能。

1 个答案:

答案 0 :(得分:3)

在最新版本的MarkLogic 9中,Optic API可以支持此要求:

  1. 使用op.fromSPARQL()访问器来投影三元组中的值列。
  2. 使用op.jsonObject()进行select()调用,以收集值作为对象的属性。
  3. 使用op.arrayAggregate()进行groupBy()调用,以将对象聚合到一个数组中。
  4. 绑定result()调用以获取输出。

有关更多信息,请参见:

http://docs.marklogic.com/op.jsonObject

和:

http://docs.marklogic.com/op.arrayAggregate

希望有帮助,