首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在带三元组的marklogic查询中使用聚合函数和?

如何在带三元组的marklogic查询中使用聚合函数和?
EN

Stack Overflow用户
提问于 2017-05-03 17:37:40
回答 2查看 480关注 0票数 1

我有以下三倍:

代码语言:javascript
复制
<?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查询:

代码语言:javascript
复制
select (SUM(?p) as ?p) where { ?s <hasQty> ?p}

我得到的结果是这个-> "0"^^xs:integer,而不是25。你能告诉我这里面有什么不对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-05 13:55:01

Marklogic是一个非常强大和通用的工具。尽管如此,在我看来,它处理RDF & SPARQL的方式至少有点不规范。

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

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

为了获得格式良好的XML,我做了一些手工整理,主要是为了说明:

代码语言:javascript
复制
<?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,这可能类似于

代码语言:javascript
复制
<?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 --在SPARQL查询中使用像<hasQty>这样的简单单词作为URI有点不寻常。

因此,要获得数量之和,请将每个数量字符串转换为int,然后使用sum:

代码语言:javascript
复制
PREFIX : <http://wanna.be/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
select (sum(xsd:int(?o)) as ?oSum)  where {?s :hasQty ?o}
票数 1
EN

Stack Overflow用户

发布于 2017-05-13 18:54:32

我认为马克是在正确的轨道上投他的字符串到int。但是,您也可以使用类型化的值创建三元组。最简单的方法是要么使用SPARQL更新,要么使用如下代码:

代码语言:javascript
复制
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)
))

如果您在查询控制台上运行,并在此之后浏览数据库,您将注意到它创建了如下所示的XML文档:

代码语言:javascript
复制
<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默认情况下将三倍保存在包含每个文档的大约100个文档中,这只是为了最佳的存储。单独保存每个三倍是可以的,但需要更多的空间。您还可以将sem:triple元素嵌入到其他XML文档中,这些元素也会被识别。这篇博客文章可能会让您感兴趣,它提供了一些关于MarkLogic中三元组的更多背景:

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

哈哈!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43766677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档