使用sparql使用子图生成图

时间:2015-02-07 15:29:44

标签: sparql rdf named-graphs

我的RDF商店中存在以下情况:

命名图:A

  S1 P1 O1

命名图:B

  S2 P2 O1

命名图:C

  S3 P3 O1

我现在要定义一个SPARQL查询,它查找O1在tripples中的所有Graphs,并将这3个Graphs + tripples存储在名为A + B + C的新Graph中

新命名图:A + B + C

Named Graph: A
   S1 P1 O1
Named Graph: B
   S2 P2 O1
Named Graph: C
   S3 P3 O1

使用Construct或insert into i只发现如何用tripples构建图形,bzw不知道如何构建包含图形的图形?

这是可能的,如果是的话怎么样?

坦克你

1 个答案:

答案 0 :(得分:4)

您无法完全按照自己的意愿行事,因为子图形无法以您似乎描述的方式明确存储在彼此之内。但是,您可以将所有三元组放入单个图表中,这可能证明是足够的:

PREFIX : <http://example.org/>
INSERT
{
  # Output triples in the desired graph
  GRAPH ?name { ?s ?p ?o }
}
WHERE
{
  # Use a sub-query to find all relevant graphs and concatenate their names together
  {
    SELECT (GROUP_CONCAT(STR(?g)) AS ?strName) (URI(?strName) AS ?name)
    WHERE
    {
       GRAPH ?g { ?s ?p :o1 }
    }
    GROUP BY ?g
  }
  # Join the name to all the relevant triples
  GRAPH ?g 
  {
    ?s ?p :o1 .
    ?s ?p ?o .
  }
}

所以这有点hacky但应该大致按照你的意愿行事。它使用子查询来查找具有相关三元组的所有图形,并将它们的名称连接在一起并将其转换为URI。请注意,这可能会创建一个非常无效的URI,这可能意味着查询的后续步骤将无效。

然后它将图形名称与图表中包含所需主题的三元组的所有三元组连接起来。

最后,它使用新创建的名称将这些输出到图表中,具体取决于商店,这可能不起作用,因为您可能会创建非法的图名称。

这可能无法完全符合您的要求,但希望能为您指明正确的方向。