从两个命名图中插入?

时间:2017-09-20 18:19:06

标签: sparql graphdb named-graphs

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

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

我们说我加载了一些这样的数据:

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

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

当我尝试

时,我从GraphDB 8.3(以及sparql.org验证程序)收到错误
SELECT  *
FROM <http://example.com/ngA>
FROM <http://example.com/ngB>
WHERE
  { ?s  <http://example.com/name>  ?o }

3 个答案:

答案 0 :(得分: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 
    }  
}

答案 1 :(得分:2)

尝试此查询:

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

答案 2 :(得分:1)

SPARQL Update在查询中提供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 query grammar,子查询不承认数据集子句。这就是SPARQL解析器拒绝您的查询的原因。