2016-06-12 9 views
0

У меня есть следующий запрос SPARQL, содержащий подвыбор. Данные содержат несколько графиков, и я хочу знать, что график значение для ?b и ?m приходит из:Имя подзапроса SPARQL

select ?b, ?m, ?g1 
where { 

{ 
    select ?o1, ?o2, ?e 
    where{ 
     graph ?g{ 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o1. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o2. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_iteration> '0'^^xsd:decimal. 
     ?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_exposureday> ?e. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid1> ?o1. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_pid2> ?o2. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype1> '5'^^xsd:decimal. 
     ?s1 <http://ndssl.bi.vt.edu/chicago/vocab/contactnetwork_acttype2> '5'^^xsd:decimal 
    } 
    }ORDER BY ASC(?e) LIMIT 1 
} 

{ 

graph ?g1 { 
?b <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy> ?o1. 
?m <http://ndssl.bi.vt.edu/chicago/vocab/getInfectedBy>* ?b. 
    } 

} 

} 

второй шаблон графа содержит переходный путь свойства и запрос обеспечивает следующие правильный результат:

b              m              g1 
----------------------------------------------------- ----------------------------------------------------- ------------------------------------------------------- 
<http://ndssl.bi.vt.edu/chicago/person/pid#446734805> <http://ndssl.bi.vt.edu/chicago/person/pid#446753456> <http://ndssl.bi.vt.edu/chicago/dendrogram/replicate1/> 

Однако я хочу видеть промежуточные узлы и подсчитывать длину пути от транзитивных отношений. Если удалить graph ?g1 из запроса, то он показывает информацию промежуточного узла, как следующее:

b              m 
--------------------------------------------------- --------------------------------------------------- 
http://ndssl.bi.vt.edu/chicago/person/pid#446718746 http://ndssl.bi.vt.edu/chicago/person/pid#446718746 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446734805 
http://ndssl.bi.vt.edu/chicago/person/pid#446734805 http://ndssl.bi.vt.edu/chicago/person/pid#446753456 

Цель запроса, чтобы выяснить имя графа для согласования ?b и ?m. Следовательно, я хочу использовать graph ?g1. Можно ли показывать промежуточные узлы, сохраняя ключевое слово ? Я использую Virtuoso.

+0

Вне темы: это незаконный синтаксис SPARQL с ','. И для удобства чтения я бы предложил сделать его более компактным, используя функции TURTLE, особенно для первого подвыборки. – AKSW

ответ

1

Поскольку вы не используете g, заявление GRAPH не требуется. Обратите также внимание, что второй оператор GRAPH использует только ?o1, поэтому следующий запрос выполняет то, что вы хотите. Вы также можете проверить SPARQL syntax в своем предложении select.

PREFIX ndssl: <http://ndssl.bi.vt.edu/chicago/vocab/> 
SELECT ?b ?m ?g1 
WHERE { 
    { 
    SELECT ?o1 
    WHERE { 
     ?s ndssl:dendrogram_infector_pid ?o1    . 
     ?s ndssl:dendrogram_infectee_pid ?o2    . 
     ?s ndssl:dendrogram_iteration  '0'^^xsd:decimal . 
     ?s ndssl:dendrogram_exposureday ?e    . 
     ?s1 ndssl:contactnetwork_pid1  ?o1    . 
     ?s1 ndssl:contactnetwork_pid2  ?o2    . 
     ?s1 ndssl:contactnetwork_acttype1 '5'^^xsd:decimal . 
     ?s1 ndssl:contactnetwork_acttype2 '5'^^xsd:decimal 
    } ORDER BY ASC(?e) LIMIT 1 
    } 
    GRAPH ?g1 { 
    ?b ndssl:getInfectedBy ?o1 . 
    ?m ndssl:getInfectedBy* ?b . 
    } 
} 

В конечной точке при условии не подходит для ?b или ?m, независимо от того, используется ли GRAPH заявление или нет.

+0

Благодарим вас за ответ. Мне нужно применить самое низкое значение «? E», поэтому я использовал «ORDER BY ASC (? E) LIMIT 1» в моем запросе. Однако вы опустили его из своего ответа. Если я использую предложение «ORDER BY», то у меня та же проблема, что и в моем вопросе. Вы можете проверить мои данные с помощью следующей конечной точки SPARQL: «http://taos.vbi.vt.edu:8890/sparql» –

+0

ОК, я вижу, что такое подвыбор, но вопрос остается немного расплывчатым. – scotthenninger

+0

Конечная точка обеспечивает соответствие для? B и? M. Мой вопрос в том, что если я использую ключевое слово «GRAPH», то оператор выбора SPARQL не предоставляет промежуточный узел из транзитивности. Однако, если я опускаю ключевое слово «GRAPH», тогда он отлично работает. Это означает, что он предоставляет информацию промежуточного узла. Почему это так? Мне нужна информация промежуточного узла с URI «GRAPH». –