2
votes

I tried to update embedded triples in marklogic using xquery but it seems to be not working for embedded triples however the same query is working for other triples can you tell me if there is some other option which needs to specified while performing an update on embedded triples. The code i used is

  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)

My document contains the following triple

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

and i want this particular subject to change into something like this

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

But when i use the xquery to update it , it does not alter anything, the embedded triple in the documents remains the same. Because when i tried to see if any of the results have changed to the subject i specified it returned me no results.

I used the following query to test.

  SELECT *
  WHERE {
  <http://www.example.com/products/1001_Test> ?predicate ?object
  }
1
1) you seem to have an extra newline char before the closing tag sem:subject 2) how do you know it is not working? What's in the document after the query completes?Florent Georges
I removed the extra newline,it still doesn't change anything, also i have updated the post please look into it.Ankita Bhowmik
1) is the triple index enabled on your database? 2) what is in the document? (when you use doc() or //sem:triples to look at the XML elements themselves)Florent Georges

1 Answers

1
votes

You need to add the option 'all' when you ask for the database nodes backing the triple: sem:database-nodes($triple, 'all').

To be perfectly honest, I am not 100% sure why, but I think this is because your sem:triples element is not the root element of the document it appears on.