我的RDF存储中存在以下情况:
命名图:一个
S1 P1 O1
命名图:B
S2 P2 O1
命名图:C
S3 P3 O1
我现在想定义一个SPARQL查询,它可以查找三元组中O1所在的所有Graphs,并将这3个Graphs+三元组存储在一个名为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,我只发现了如何从元组中构建图,而不是如何构建包含图的图?
这可能吗?如果可能的话,怎么做?
坦克你
您不能完全按照自己的意愿执行操作,因为子图不能以您所描述的方式显式存储在彼此之间。然而,你可以把所有的三元组放在一个单独的图中,这可能已经足够了:
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 .
}
}
所以这是一个小技巧,但应该大致做你想做的事。它使用子查询来查找所有具有相关三元组的图,并将它们的名称连接在一起,然后将其转换为URI。请注意,这很可能会创建一个非常无效的URI,这可能意味着查询的后续步骤将不起作用。
然后,它将该图名称与图中包含所需主题的三元组的所有三元组连接在一起。
最后,它用新创建的名称将这些输出到图中,根据存储的不同,这一位可能不起作用,因为您可能创建了非法的图名称。
这可能并不能完全达到你想要的效果,但希望能为你指明正确的方向。