2015-06-26 10 views
2

У меня есть следующие 2 документа. 1 документ имеет эти данные:Выводы во встроенных тройках Marklogic

<Content> 
    <sem:triples xmlns:sem="http://marklogic.com/semantics"> 
    <sem:triple> 
     <sem:subject>http://sector#Basic_Materials</sem:subject> 
     <sem:predicate>http://relationship#isTRBCEconomicSectorOf</sem:predicate> 
     <sem:object>http://company#CST_Mining_Group_Limited</sem:object> 
    </sem:triple> 
    </sem:triples> 
    <AnalystName>Henrik Christiansson</AnalystName> 
    <DocumentFormat>pdf</DocumentFormat> 
</Content> 

И еще один документ, который имеет следующие данные:

<Content> 
    <sem:triples xmlns:sem="http://marklogic.com/semantics"> 
    <sem:triple> 
     <sem:triple> 
     <sem:subject>http://sector#Energy_-_Fossil_Fuels</sem:subject> 
     <sem:predicate>http://relationship#isTRBCEconomicSectorOf</sem:predicate> 
     <sem:object>http://company#Bodycote_PLC</sem:object> 
     </sem:triple> 
    </sem:triple> 
    </sem:triples> 
    <AnalystName>Pawel Dziedzic</AnalystName> 
    <DocumentFormat>pdf</DocumentFormat> 
</Content> 

Я сделал отношения между этими двумя встроенными троек в

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 

INSERT DATA 
{ 

    <http://company#CST_Mining_Group_Limited> rdfs:subClassOf <http://company#Bodycote_PLC> . 

} 

Когда я запрос, чтобы получить все результаты, которые являются economicSector of Bodycote Plc, я получаю оба эти тройки, что правильно, но когда я использую комбинированный запрос, он не дает мне requi красные результаты.

Например, когда запрос имеет экономический сектор BodyCote, а также имя аналитика - Хенрик Кристиансен, я хочу, чтобы он вернул первую тройку, но это не так.

Я использовал следующий запрос:

xquery version "1.0-ml"; 

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

sem:sparql(
    'SELECT ?subject 
    WHERE { 
    ?subject <http://relationship#isTRBCEconomicSectorOf> <http://company#Bodycote_PLC> 
    }', 
(), 
(), 
    cts:and-query((
    cts:element-value-query(xs:QName("AnalystName"), "Henrik Christiansson") 
)) 
) 

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

ответ

1

Проблема с вашим подходом заключается в том, что запрос cts: query выбирает только соответствующие документы, а не управляемую тройку, которая определяет подкласс. Вы здесь не используете настоящую выписку, но на самом деле вытесняете правила вывода, буквально добавляя троек. Вместо этого используйте набор правил, что является более гибким и будет работать лучше. См. Semantics guide.

После того, как у вас есть файл набора правил на месте, вам нужно обернуть запрос в sem:store, а затем применить набор правил с sem:ruleset-store:

sem:sparql(
    ' 
    SELECT ?subject 
    WHERE { 
     ?subject <http://relationship#isTRBCEconomicSectorOf <http://company#Bodycote_PLC> 
    } 
    ', 
(), 
(), 
    sem:ruleset-store(
    "myrules", 
    sem:store(
    (), 
     cts:and-query((
     cts:element-value-query(xs:QName("AnalystName"), "Henrik Christiansson") 
    )) 
    ) 
) 
) 

HTH!