我正在寻找一种简单的方法,将两个或多个命名图(但不是整个未命名的默认图)中的三元组插入到另一个命名图中。我正在使用GraphDB。
我想这可以通过在WHERE
部分中多次写出相同的查询,包装在多个GRAPH
规范中,然后将它们组合在一起来完成,但我的WHERE
很长,我宁愿不多次写出来。
假设我加载了一些这样的数据:
INSERT DATA {
GRAPH <http://example.com/ngA> {
<http://example.com/person1> <http://example.com/name> "Arthur" .
}
GRAPH <http://example.com/ngB> {
<http://example.com/person1> <http://example.com/name> "Brian" .
}
GRAPH <http://example.com/ngC> {
<http://example.com/person1> <http://example.com/name> "Charlie" .
}
}
我可以将某个模式的所有三元组从默认的未命名图复制到一个新的命名图中,如下所示:
INSERT {
GRAPH <http://example.com/ngZ> {
?s <http://example.com/moniker> ?o .
}
}
WHERE
{ ?s <http://example.com/name> ?o }
从两个或多个(但不是全部)命名图中SELECT
给定模式的三元组的一种简单方法是
SELECT *
FROM <http://example.com/ngA>
FROM <http://example.com/ngB>
WHERE
{ ?s <http://example.com/name> ?o }
如果我想将这些三元组从这些指定的图形复制到另一个图形中怎么办?
当我尝试时,我收到来自 GraphDB 8.3(以及 sparql.org 验证器)的错误
INSERT {
GRAPH <http://example.com/ngZ> {
?s <http://example.com/moniker> ?o .
}
}
WHERE
{ SELECT *
FROM <http://example.com/ngA>
FROM <http://example.com/ngB>
WHERE
{ ?s <http://example.com/name> ?o } }
尝试以下查询:
PREFIX ex: <http://example.com/>
INSERT {
GRAPH ex:ngZ { ?s ex:moniker ?o }
}
WHERE {
GRAPH ?g { ?s ex:name ?o }
FILTER (?g IN ( ex:ngA, ex:ngB ) )
}
然后:
PREFIX ex: <http://example.com/>
SELECT *
FROM NAMED ex:ngZ
WHERE {
GRAPH ?g { ?s ?p ?o }
} LIMIT 100
这是你需要的吗?
顺便说一下,存在COPY
(谨慎使用ADD
!
SPARQL 更新提供了类似于查询中的FROM
和FROM NAMED
USING
和USING NAMED
:
和 USING NAMED 子句会影响在计算 WHERE 子句时使用的 RDF 数据集。这以与 FROM 和 FROM 命名子句相同的方式描述数据集
您可以将要求表示为更新,如下所示:
INSERT {
GRAPH <http://example.com/ngZ> {
?s <http://example.com/moniker> ?o .
}
}
USING <http://example.com/ngA>
USING <http://example.com/ngB>
WHERE
{ ?s <http://example.com/name> ?o }
另请注意,根据 SPARQL 查询语法,子查询不允许数据集子句。这就是SPARQL解析器拒绝您的查询的原因。
谢谢,@Stanislav·克拉林
想想看,这也有效:
PREFIX ex: <http://example.com/>
INSERT {
GRAPH ex:ngZ {
?s ex:moniker ?o
}
}
WHERE {
values ?g {
ex:ngA ex:ngB
}
GRAPH ?g {
?s ex:name ?o
}
}