2

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
  }
Ankita Bhowmik
  • 463
  • 1
  • 5
  • 20
  • 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 Jun 24 '15 at 08:38
  • I removed the extra newline,it still doesn't change anything, also i have updated the post please look into it. – Ankita Bhowmik Jun 24 '15 at 09:34
  • 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 Jun 24 '15 at 10:01

1 Answers1

1

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.

Florent Georges
  • 2,190
  • 1
  • 15
  • 24