2015-06-24 29 views
2

我試圖使用xquery更新marklogic中的嵌入三元組,但它似乎不適用於嵌入三元組,但是相同的查詢正在爲其他三元組工作 可以告訴我是否有其他選項這需要在嵌入三元組上進行更新時指定。 我使用的代碼是在MarkLogic中使用xquery更新嵌入的三元組

xquery version "1.0-ml"; 
    import module namespace sem = "http://marklogic.com/semantics" 
    at "/Marklogic/semantics.xqy"; 

    let $triples := cts:triples(sem:iri("http://smartlogic.com/document#2012-10-26_DNB.OL_(Citi)_DNB_ASA_(DNB.OL)__Model_Update.61259187.xml"),()()) 
    for $triple in $triples 
    let $node := sem:database-nodes($triple) 
    let $replace := 
    <sem:triple> 
    <sem:subject>http://www.example.com/products/1001_Test 
    </sem:subject> 
    {$node/sem:predicate, $node/sem:object} 
    </sem:triple> 

    return $node ! xdmp:node-replace(., $replace) 

我的文檔包含以下三重

<sem:triples xmlns:sem="http://marklogic.com/semantics"> 
    <sem:triple> 
    <sem:subject>http://smartlogic.com/document#2012-10-26_DNB.OL_(Citi)_DNB_ASA_(DNB.OL)__Model_Update.61259187.xml</sem:subject> 
    <sem:predicate>http://www.smartlogic.com/schemas/docinfo.rdf#cik</sem:predicate> 
    <sem:object>datatype="http://www.w3.org/2001/XMLSchema#string</sem:object> 
    </sem:triple> 
</sem:triples> 

,我想這個特殊如有變更,弄成這個樣子

<sem:subject>http://www.example.com/products/1001_Test</sem:subject> 

但是,當我使用xquery更新它,它不會改變任何東西,文檔中的嵌入三元組保持不變。 因爲當我試圖查看是否有任何結果已改變爲我指定的主題時,它返回了我沒有結果。

我用下面的查詢來測試。

SELECT * 
    WHERE { 
    <http://www.example.com/products/1001_Test> ?predicate ?object 
    } 
+0

1)你似乎有一個額外的換行符在結束標記'sem:subject'之前2)你怎麼知道它不工作?查詢完成後文檔中包含什麼內容? –

+0

我刪除了額外的換行符,它仍然不會改變任何內容,我也更新了該文章,請仔細閱讀它。 –

+0

1)數據庫上啓用了三重索引嗎? 2)文件**中的**是什麼? (當你使用'doc()'或'// sem:triples'來查看XML元素本身) –

回答

1

你需要的時候你問數據庫節點支持三重添加選項'all'sem:database-nodes($triple, 'all')

坦率地說,我不是100%確定爲什麼,但我認爲這是因爲您的sem:triples元素不是它出現在其上的文檔的根元素。

+1

使用嵌入三元組,謝謝。 –