我有以下三倍:
<?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。你能告诉我这里面有什么不对吗?
发布于 2017-05-05 13:55:01
Marklogic是一个非常强大和通用的工具。尽管如此,在我看来,它处理RDF & SPARQL的方式至少有点不规范。
将来,您可能可以阅读以下内容:https://docs.marklogic.com/sem:rdf-serialize,以了解如何将MarkLogic的本地三元组表示转换为标准RDF。
现在我不是XML专家,但我不认为您的三元组是有效的XML。如果是这样的话,您可以编写一个XSLT转换来将其转换为RDF。
为了获得格式良好的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 --在SPARQL查询中使用像<hasQty>这样的简单单词作为URI有点不寻常。
因此,要获得数量之和,请将每个数量字符串转换为int,然后使用sum::
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-13 18:54:32
我认为马克是在正确的轨道上投他的字符串到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)
))如果您在查询控制台上运行,并在此之后浏览数据库,您将注意到它创建了如下所示的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默认情况下将三倍保存在包含每个文档的大约100个文档中,这只是为了最佳的存储。单独保存每个三倍是可以的,但需要更多的空间。您还可以将sem:triple元素嵌入到其他XML文档中,这些元素也会被识别。这篇博客文章可能会让您感兴趣,它提供了一些关于MarkLogic中三元组的更多背景:
http://developer.marklogic.com/blog/managed-vs-unmanaged-triples
哈哈!
https://stackoverflow.com/questions/43766677
复制相似问题