Rdf 提取由一组节点诱导的子图

Rdf 提取由一组节点诱导的子图,rdf,sparql,jena,virtuoso,Rdf,Sparql,Jena,Virtuoso,给定对象和有向关系的通用图: @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 . 我目前的尝试是使用一堆可选的子句来尝试所有可能

给定对象和有向关系的通用图:

@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 .
我目前的尝试是使用一堆
可选的
子句来尝试所有可能的关系,这可能不是最好的方法:

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} . }
考虑到这些数据(基本上是您的,除了我在行尾添加了
s,因此它是有效的,并且我添加了两个三元组,这样我们就可以看到,仅仅有一个不在特殊集合中的主题或对象是否会使三元组不出现在结果中):

这里的用法只是说,
?s
必须从一组特定的值中提取,而
?o
必须从一组特定的值中提取。我认为没有办法避免重复每个地点的特殊资源清单。也就是说,您必须编写两次
{obj:obj1-obj:obj2-obj:obj3}
,但这仍然比枚举所有可能的组合容易得多

您也可以考虑使用<代码>构造<代码>,而不是<代码>选择< /C> >,如果您想要返回的实际上是图,而不是一组变量绑定。例如,通过此查询:

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 .
}
前缀obj:
构造{s?p?o}其中{
值?s{obj:obj1 obj:obj2 obj:obj3}
值?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 TTL--query query.rq--data data.n3
@前缀obj:。
@前缀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
.
.
.
$sparql-out RDF/XML--query query.rq--data data.n3

您提供的数据不是合法的,您显示的SPARQL查询也无效
SELET
不是关键字。今后,请复制数据并对vebatim进行编码。
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 |
----------------------------------
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 .
}
$ 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> .