2013-10-10 3 views
2

Учитывая общий график объектов и направленные отношения:извлечение подграфа, индуцированное множество узлов

@prefix obj: <http://example.org/obj/> . 
@prefix rel: <http://example.org/rel/> . 

obj:obj1 rel:rel1 obj:obj2 . 
obj:obj3 rel:rel2 obj:obj2 . 
obj:obj9 rel:rel5 obj:obj8 . 
obj:obj1 rel:rel1 obj:obj3 . 

и подмножество объектов, скажут obj1, obj2, obj3, как извлечь подграф, который содержит только это подмножество объектов независимо от конкретных отношений из полного графика, используя простой запрос SPARQL? Полученный подграф должен быть:

obj:obj1 rel:rel1 obj:obj2 . 
obj:obj3 rel:rel2 obj:obj2 . 
obj:obj1 rel:rel1 obj:obj3 . 

моя текущая попытка попробовать все возможные отношения, используя кучу OPTIONAL положений, которые, вероятно, не самый лучший способ это сделать:

SELECT ?r1 ?r2 ?r3 ?r4 ?r5 ?r6 WHERE { 
OPTIONAL {obj:obj1 ?r1 obj:obj2} . 
OPTIONAL {obj:obj1 ?r2 obj:obj3} . 
OPTIONAL {obj:obj2 ?r3 obj:obj3} . 
OPTIONAL {obj:obj2 ?r4 obj:obj1} . 
OPTIONAL {obj:obj3 ?r5 obj:obj1} . 
OPTIONAL {obj:obj3 ?r6 obj:obj2} . } 
+1

Данные, которые вы предоставили не является законным Turtle, и запрос SPARQL, который вы указали, недействителен, либо 'SELET' не является ключевым словом. В будущем скопируйте данные и код vebatim. –

ответ

5

Учитывая эти данные (которые по существу принадлежат вам, за исключением того, что я добавил . s в конце строк, так что это действительная черепаха, и я добавил пару троек, чтобы мы могли видеть, объект или объект, не находящийся в специальном наборе, сохранит тройку из результатов):

@prefix obj: <http://example.org/obj/> . 
@prefix rel: <http://example.org/rel/> . 

obj:obj1 rel:rel1 obj:obj2 . 
obj:obj3 rel:rel2 obj:obj2 . 
obj:obj1 rel:rel4 obj:obj8 . # additional triple 
obj:obj9 rel:rel7 obj:obj2 . # additional triple 
obj:obj9 rel:rel5 obj:obj8 . 
obj:obj1 rel:rel1 obj:obj3 . 

Вы можете использовать запрос следующим образом:

prefix obj: <http://example.org/obj/> 

select ?s ?p ?o where { 
    values ?s { obj:obj1 obj:obj2 obj:obj3 } 
    values ?o { obj:obj1 obj:obj2 obj:obj3 } 
    ?s ?p ?o . 
} 

, чтобы получить результаты, как это:

$ sparql --query query.rq --data data.n3 
---------------------------------- 
| s  | p  | o  | 
================================== 
| obj:obj1 | rel:rel1 | obj:obj3 | 
| obj:obj1 | rel:rel1 | obj:obj2 | 
| obj:obj3 | rel:rel2 | obj:obj2 | 
---------------------------------- 

Использование values здесь как раз говорит, что ?s должен извлечь из конкретной набор значений и что ?o должен быть нарисован из определенного набора значений. Я не думаю, что есть способ избежать повторения списка специальных ресурсов в каждом месте. То есть вам придется писать { obj:obj1 obj:obj2 obj:obj3 } дважды, но это все же намного проще, чем перечисление всех возможных комбинаций.

Возможно, вы также можете использовать здесь construct, а не select, если то, что вы хотите назад, на самом деле является графиком, а не набором переменных привязок. Например, с этим запросом:

prefix obj: <http://example.org/obj/> 

construct { ?s ?p ?o } where { 
    values ?s { obj:obj1 obj:obj2 obj:obj3 } 
    values ?o { obj:obj1 obj:obj2 obj:obj3 } 
    ?s ?p ?o . 
} 

вы можете получить фактический RDF граф назад:

$ sparql -out TTL --query query.rq --data data.n3 
@prefix obj: <http://example.org/obj/> . 
@prefix rel: <http://example.org/rel/> . 

obj:obj1 rel:rel1 obj:obj3 , obj:obj2 . 

obj:obj3 rel:rel2 obj:obj2 . 
$ sparql -out N-Triples --query query.rq --data data.n3 
<http://example.org/obj/obj1> <http://example.org/rel/rel1> <http://example.org/obj/obj3> . 
<http://example.org/obj/obj1> <http://example.org/rel/rel1> <http://example.org/obj/obj2> . 
<http://example.org/obj/obj3> <http://example.org/rel/rel2> <http://example.org/obj/obj2> . 
$ sparql -out RDF/XML --query query.rq --data data.n3 
<rdf:RDF 
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
    xmlns:obj="http://example.org/obj/" 
    xmlns:rel="http://example.org/rel/"> 
    <rdf:Description rdf:about="http://example.org/obj/obj1"> 
    <rel:rel1> 
     <rdf:Description rdf:about="http://example.org/obj/obj3"> 
     <rel:rel2 rdf:resource="http://example.org/obj/obj2"/> 
     </rdf:Description> 
    </rel:rel1> 
    <rel:rel1 rdf:resource="http://example.org/obj/obj2"/> 
    </rdf:Description> 
</rdf:RDF>