2014-12-11 4 views

ответ

1

Хотя я не думаю, что вы можете сделать это с помощью РДФ-вставки, может быть, это было бы полезно для вас, чтобы проверить встроенные тройки записи в документации:

Из MarkLogic Semantics Developer's Guide

Triple documents with sem:triple as the document root are managed triples in MarkLogic Server.

You can also embed triples within XML documents and load them into MarkLogic as-is.

For example:

<?xml version="1.0" encoding="UTF-8"?> 
<article> 
    <info> 
    <title>News for April 9, 2013</title> 
     <sem:triples xmlns:sem="http://marklogic.com/semantics> 
     <sem:subject>http://example.org/article</sem:subject> 
     <sem:predicate>http://example.org/mentions</sem:predicate> 
     <sem:object>http://example.org/London</sem:object> 
     </sem:triples> 
    </info> 
</article> 

The loaded triples are automatically indexed with a special-purpose triple index. The triple index allows you to immediately search the RDF data for which you have the required privileges.

Возможно, вы можете попробовать вставить узел sem: triples в документ и посмотреть, индексируется ли это?

+0

Структура семерки: тройки неполна, ей не хватает sem: triple, которая обертывает каждую комбинацию предметов/предикатов/объектов. Это вы придерживаетесь этой структуры, вы можете поместить столько троек в любой фрагмент, и они будут проиндексированы, если вы включите тройной индекс. Вы можете даже поместить их в свойства. – grtjn

+0

Можете быть более надежными в будущем, хотя использовать конструкцию sem: triple или использовать что-то вроде 'sem: rdf-serialize (sem: rdf-parse ($ rdf)," triplexml ")'. Стивен Бакстон дает хороший пример. – grtjn

2

Alex, вы можете вставить тройку в документ, используя xdmp: node-insert-child(). Существует один трюк, который заключается в том, что функция ожидает узел, а тройка не является узлом. Это работает:

xdmp:node-insert-child(
    fn:doc('has-a-triple.xml')/doc, 
    <t>{sem:triple(sem:iri("Firefly"), "is-a", "TV show")}</t>/* 
) 

Если вы попробуете это без <t/>/* трюк, вы получите сообщение об ошибке:

xdmp:node-insert-child(
    fn:doc('has-a-triple.xml')/doc, 
    sem:triple(sem:iri("Firefly"), "is-a", "TV show") 
) 

возвращается

XDMP-ARGTYPE: (err:XPTY0004) xdmp:node-insert-child(fn:doc("has-a-triple.xml")/doc, 
    sem:triple(sem:iri("Firefly"), "is-a", "TV show")) -- arg2 is not of type node() 
+0

Или 'document {...}/*' вместо '/*'. Это немного дольше, но мне немного легче набирать и читать. – mblakele

3

Во-первых, ключ здесь должен признать, что существует два способа хранения и управления троек в MarkLogic.

  1. управляемые троек - здесь вы хотите использовать MarkLogic как «просто трехместный магазин». Загрузите тройки с помощью mlcp (загрузчик командной строки) или sem: rdf-load() или sem: rdf-insert(). В этом случае вы не хотите знать или ухаживать за документами, в которых хранятся троек, - вы просто хотите загрузить троек, чтобы впоследствии вы могли запросить их с помощью SPARQL. Вот почему sem: rdf-insert() не имеет аргумента «вставить в этот документ».

  2. встроенные тройки - тройки встроены в документ XML (или JSON). В этом случае тройка является концептуально частью документа; поэтому, если вы хотите вставить тройку в документ (вставить тройку в документ), вы должны посмотреть на API-интерфейсы , а не на троек.

После того, как вы едите, что ментальная модель, вы можете использовать семафор: РДФ-вставка(), если ваша тройка, по существу, «свободно плавающий» - то есть не имеет значения, какой документ это в Или. может выбрать что-то вроде xdmp: node-insert-child(), если вы действительно хотите разместить эту тройку внутри существующего документа в какой-то позиции. (В MarkLogic 8 вы также можете использовать SPARQL Update для вставки управляемых/свободно плавающих троек.

Это говорит о том, что я хотел бы узнать, могу ли я сделать узел-вставку-потомка более простым и интуитивным способом - т.е. без «трюка» выше.

Во-первых, полезно создать тройку, используя sem: iri() и sem: triple() выше, хотя вы могли бы создать тройку непосредственно в XML. Использование sem: constructors более надежный.

Во-вторых, sem: triple() возвращает объект типа sem: triple, а не узел XML. Поэтому вы не можете передать его непосредственно в xdmp: node-insert-child(). Но там - это вспомогательная функция для перевода из семестра: triple в узел XML - sem: rdf-serialize() с опцией «triplexml».

Таким образом, вы можете сделать это:

xdmp:document-insert("/test/test.xml", <doc><title>test</title></doc>) 

затем:

import module namespace sem = "http://marklogic.com/semantics" 
     at "/MarkLogic/semantics.xqy"; 

xdmp:node-insert-child(
    fn:doc('/test/test.xml')/doc, 
    sem:rdf-serialize(
     sem:triple(sem:iri("Firefly"), "is-a", "TV show"), 
     "triplexml" 
    ) 
) 

... и вы получите:

fn:doc('/test/test.xml') 

=>

<doc> 
    <title>test</title> 
    <sem:triples xmlns:sem="http://marklogic.com/semantics"> 
    <sem:triple> 
     <sem:subject>Firefly</sem:subject> 
     <sem:predicate datatype="http://www.w3.org/2001/XMLSchema#string">is-a</sem:predicate> 
     <sem:object datatype="http://www.w3.org/2001/XMLSchema#string">TV show</sem:object> 
    </sem:triple> 
    </sem:triples> 
</doc> 
Смежные вопросы