2017-05-03 21 views
1

我有以下三元:如何在使用triple的marklogic sparql查詢中使用SUM之類的聚合函數?

<?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。 你能否提出一些建議?

+0

我沒有MarkLogic實例啓動並運行... 1)您確定是一個有效的謂詞嗎?比如,你從'select * where'中得到什麼?{?s ?p}'2)如果該查詢有效,是你的數字類型的數量?它看起來像他們是字符串,需要轉換。 –

+0

是的謂詞工作正常,但如何將它們轉換爲數字類型,我試圖用^^ xs:integer存儲它們,但沒有工作 –

+0

您可以將您的MarkLogic三元組轉換爲標準RDF嗎?我很樂意爲您編寫完整的解決方案。 –

回答

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>這樣的裸字作爲SPARQL查詢中術語的URI是有點不尋常的。

因此,爲了得到量的總和,每個投量字符串爲int,然後求和:

PREFIX : <http://wanna.be/> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
select (sum(xsd:int(?o)) as ?oSum) where {?s :hasQty ?o} 
+0

非常感謝描述性的答案,並找到時間,讚賞:) –

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) 
)) 

如果從查詢控制檯上方運行,並探索後,該數據庫中,你會發現它創建了一個看起來像這樣的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> 

注意在sem:object元素datatype屬性。有了這個datatype屬性,你原來的SPARQL語句就可以正常工作。

順便說一下,MarkLogic在默認情況下將三元組保存在包含每個約100個元素的XML文檔中,僅用於最優存儲。單獨保存每個三元組是可以的,但需要更多的空間。您還可以在其他XML文檔中嵌入sem:triple元素,這些文檔也可以被識別。此博客文章你可能感興趣的,它給在MarkLogic的三倍多一些背景:

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

HTH!

+0

同意,很好的解釋,但你如何定義數據類型也爲三元組在上述三重定義? –

+0

你的意思是什麼三重定義? 'sem:object'元素?在其上放置一個'datatype'屬性。對於XQuery代碼,您可以使用[sem:typed-literal](http://docs.marklogic.com/sem:typed-literal)。在SPARQL中,您可以使用Mark的答案最後幾行中提到的xsd:int cast。 – grtjn