1

我有以下三元组:

<?xml  version="1.0" encoding="UTF-8"?>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
  <sem:triple>
    <sem:subject>item1</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object>20</sem:object>
  </sem:triple>
</sem:triples>


<?xml  version="1.0" encoding="UTF-8"?>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
  <sem:triple>
    <sem:subject>item2</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object>5</sem:object>
  </sem:triple>
</sem:triples>`

这是我用来计算这些数量总和的 SPARQL 查询:

select (SUM(?p) as ?p) where { ?s <hasQty> ?p}

我得到的结果是这个 ->"0"^^xs:integer而不是 25。你能建议这有什么问题吗?

4

2 回答 2

1

我认为马克在将字符串转换为 int 方面走在了正确的轨道上。但是您也可以创建带有类型值的三元组。最简单的方法是使用 SPARQL 更新,或者如下代码:

xquery version "1.0-ml";

import module namespace sem = "http://marklogic.com/semantics" 
      at "/MarkLogic/semantics.xqy";

sem:rdf-insert((
  sem:triple(sem:iri("item1"), sem:iri("hasQty"), 20),
  sem:triple(sem:iri("item2"), sem:iri("hasQty"), 5)
))

如果您从 Query Console 上面运行,然后探索数据库,您会注意到它创建了一个如下所示的 XML 文档:

<sem:triples xmlns:sem="http://marklogic.com/semantics">
  <sem:triple>
    <sem:subject>item1</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object datatype="http://www.w3.org/2001/XMLSchema#integer">20</sem:object>
  </sem:triple>
  <sem:triple>
    <sem:subject>item2</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object datatype="http://www.w3.org/2001/XMLSchema#integer">5</sem:object>
  </sem:triple>
</sem:triples>

注意元素的datatype属性sem:object。有了该datatype属性,您的原始 SPARQL 语句就可以正常工作。

顺便说一句,默认情况下,MarkLogic 将三元组保存在 XML 文档中,每个文档包含大约 100 个,只是为了优化存储。单独保存每个三元组是可以的,但会占用更多空间。您还可以sem:triple在其他 XML 文档中嵌入元素,这些元素也会被识别。这篇博客文章可能会让您感兴趣,它提供了有关 MarkLogic 三元组的更多背景信息:

http://developer.marklogic.com/blog/managed-vs-unmanaged-triples

于 2017-05-13T18:54:32.553 回答
1

Marklogic 是一个非常强大且用途广泛的工具。话虽如此,在我看来,它处理 RDF 和 SPARQL 的方式至少有点不标准。

将来,您可能会阅读以下内容:https ://docs.marklogic.com/sem: rdf-serialize 以了解如何将 MarkLogic 的三元组本机表示转换为标准 RDF。

现在我不是 XML 专家,但我认为您的三元组块不是有效的 XML。如果是,您可以编写一个 XSLT 转换将其转换为 RDF XML。

我做了一些手动整理以获得格式良好的 XML,主要用于说明目的:

<?xml version="1.0" encoding="UTF-8"?>
<sem:triples xmlns:sem="http://marklogic.com/semantics">
  <sem:triple>
    <sem:subject>item1</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object>20</sem:object>
  </sem:triple>
  <sem:triple>
    <sem:subject>item2</sem:subject>
    <sem:predicate>hasQty</sem:predicate>
    <sem:object>5</sem:object>
  </sem:triple>
</sem:triples>

作为 RDF/XML,这可能看起来像

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
        xmlns="http://wanna.be/"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

<rdf:Description rdf:about="http://wanna.be/item1">
        <hasQty>20</hasQty>
</rdf:Description>

<rdf:Description rdf:about="http://wanna.be/item2">
        <hasQty>5</hasQty>
</rdf:Description>

</rdf:RDF>

我创建了一个http://wanna.be/的默认命名空间,您可以使用默认缩写来表示 :hasQty 而不是http://wanna.be/hasQty<hasQty>使用像URI 这样的裸词有点不寻常对于 SPARQL 查询中的一个术语。

因此,要获得数量的总和,请将每个数量字符串转换为一个 int,然后求和:

PREFIX : <http://wanna.be/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select (sum(xsd:int(?o)) as ?oSum)  where {?s :hasQty ?o}
于 2017-05-05T13:55:01.867 回答