SPARQL: Как объединить два предмета для использования в CONSTRUCT?

Я пишу запрос SPARQL, в котором я создаю график RDF. Я использую SPARQL CONSTRUCT. В соответствии с требованиями моей работы я должен объединить два предметных значения и использовать их с оператором CONSTRUCT. Я попытался сделать следующее (мой график RDF находится в Virtuoso):

prefix map: <#> 
prefix db: <> 
prefix vocab: <vocab/> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix xsd: <http://www.w3.org/2001/XMLSchema#> 
prefix d2rq: <http://www.wiwiss.fu-berlin.de/suhl/bizer/D2RQ/0.1#> 
prefix jdbc: <http://d2rq.org/terms/jdbc/>
prefix fn: <http://www.w3.org/2005/xpath-functions#> 

CONSTRUCT {
?p1 a d2rq:ClassMap
}

FROM <http://www.ndssl.bi.vt.edu/fuse>
WHERE 
{ 
<http://www.ndssl.bi.vt.edu/fuse#DataSource> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>.
<http://www.ndssl.bi.vt.edu/fuse#OracleDataSource>  <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://www.ndssl.bi.vt.edu/fuse#DataSource>.
?DB <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   <http://www.ndssl.bi.vt.edu/fuse#OracleDataSource>.
<http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class>.
?Table <http://www.w3.org/1999/02/22-rdf-syntax-ns#type>   <http://www.ndssl.bi.vt.edu/fuse#HouseholdsWithinAdminRegion>.
BIND(CONCAT(?DB, ?Table) AS ?p1)
}

Однако я получаю следующую ошибку:

Virtuoso RDF01 Error Bad variable value in CONSTRUCT: "http://www.ndssl.bi.vt.edu/fuse#PROTOPOPhttp://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1" (tag 246 box flags 0) is not a valid subject, only object of a triple can be a literal

Пожалуйста, дайте мне знать, как решить эту проблему.


person Beautiful Mind    schedule 26.02.2016    source источник
comment
CONCAT возвращает буквальное (строковое) значение, но используется в CONSTRUCT как подлежащее. В RDF только объектная часть троек может содержать литеральные значения (как сказано в этом сообщении об ошибке).   -  person CaptSolo    schedule 26.02.2016
comment
Если тройка каким-то образом оказывается недопустимой, литерал-подлежащее, bnode-предикат, предполагается, что процессор просто пропустит эту тройку в результатах.   -  person AndyS    schedule 26.02.2016


Ответы (1)


Ошибка в основном говорит о том, что вы объединяете два URI:

http://www.ndssl.bi.vt.edu/fuse#PROTOPOP
http://www.ndssl.bi.vt.edu/fuse#MIAMI_HOUSEHOLD_2009_1

в буквал. Я не знаю, что именно вы пытаетесь сделать, но вы действительно хотите объединить ВЕСЬ URI или только последнюю часть после #? Если вы хотите объединиться после #, вам нужно опустить пространство имен.

bind (concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:))) as ?p)

Даже на этом этапе результатом привязки является literal, который необходимо преобразовать в URI.

bind (uri(concat(strafter(str(?s),str(fuse:)), strafter(str(?o),str(fuse:)))) as ?p)

Как правило, я бы значительно упростил ваш запрос:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
prefix fuse: <http://www.ndssl.bi.vt.edu/fuse#>
prefix owl:<http://www.w3.org/2002/07/owl#>

CONSTRUCT {
    ?p1 a d2rq:ClassMap
}

FROM <http://www.ndssl.bi.vt.edu/fuse>
WHERE 
{ 
    fuse:DataSource a owl:Class.
    fuse:OracleDataSource  rdfs:subClassOf fuse:DataSource.
    ?DB a   fuse:DataSource.
    fuse:HouseholdsWithinAdminRegion a owl:Class.
    ?Table a  fuse:HouseholdsWithinAdminRegion.

    bind (uri(concat(strafter(str(?DB),str(fuse:)), 
        strafter(str(?Table),str(fuse:)))) as ?p)
}
person Artemis    schedule 26.02.2016
comment
Спасибо за ваш ответ. Однако это не работает. Это дает мне следующую ошибку: Virtuoso 37000 Ошибка SP031: Компилятор SPARQL: Внутренняя ошибка: встроенная функция не реализована. Пожалуйста, дайте мне знать, как это исправить. - person Beautiful Mind; 26.02.2016
comment
Запрос не работает: 1) есть пробел между ? и табл. 2) переменная ?TD не присваивается. - person UninformedUser; 27.02.2016
comment
@ user2151087: возможно, функция STRAFTER не реализована в используемой вами версии Virtuoso. - person UninformedUser; 27.02.2016