【问题标题】:extracting the subgraph induced by a set of nodes提取由一组节点诱导的子图
【发布时间】:2013-10-10 07:15:57
【问题描述】:

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

@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} . }

【问题讨论】:

  • 您提供的数据不是合法的 Turtle,您显示的 SPARQL 查询也无效,SELET 不是关键字。以后请复制数据和代码vebatim。

标签: rdf sparql jena virtuoso


【解决方案1】:

鉴于这些数据(这基本上是你的,除了我在行尾添加了.s 以便它是有效的 Turtle,并且我添加了几个三元组以便我们将能够查看是否只有一个不在特殊集合中的主题或宾语会使三元组排除在结果之外):

@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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2014-04-06
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多