2

我正在寻找一种简单的方法将三元组从两个或多个命名图(但不是整个未命名的默认图)插入另一个命名图。 我正在使用 GraphDB。

我想这可以通过在该部分中多次写出相同的查询WHERE,包装在多个 GRAPH规范中,然后将它们合并在一起来完成,但是我WHERE的 s 很长,我不想多次写出它们。

假设我已经加载了一些这样的数据:

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 }

如果我想将这些三元组从那些指定的图表中复制到另一个图表中怎么办?

当我尝试

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 } }
4

3 回答 3

4

试试这个查询:

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.

于 2017-09-20T19:12:32.483 回答
3

谢谢,@Stanislav Kralin

想一想,这也有效:

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 
    }  
}
于 2017-09-20T20:41:58.803 回答
3

SPARQL 更新提供USINGUSING NAMED类似FROMFROM NAMED查询:

USING 和 USING NAMED 子句会影响评估 WHERE 子句时使用的 RDF 数据集。这以与 FROM 和 FROM NAMED 子句相同的方式描述数据集

您可以将要求表达为 UPDATE ,如下所示:

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 解析器拒绝您的查询的原因。

于 2017-09-22T18:17:44.107 回答