加入SPARQL查询

3
我在RDF知识库中有多个图表。
for example
<123> <hasValue> "23" <graph1>
<234> <hasValue> "47" <graph1>
<374> <hasValue> "23" <graph1>
-----------
----------
<456> <hasFeature> "50" <graph2>
<244> <hasFeature> "23" <graph2>
<123> <hasFeature> "23" <graph2>
---------------------

现在我想运行SPARQL查询以获取两个图表共同的结果。 假设我为一个图表运行以下查询,我会得到以下结果。
SELECT ?subject 
FROM Named <http://www.xyz.com/namespace/graph1>
WHERE {GRAPH ?graph
   {?subject prefix:hasValue "23" .}} 

<123>
<374>
---
---
---

如果运行以下第二个查询用于 graph2,将会得到以下结果。
SELECT ?subject 
FROM Named <http://www.xyz.com/namespace/graph2>
WHERE {GRAPH ?graph
   {?subject prefix:hasFeature "23" .}} 

<244>
<123>
-----

然而,我想要的主题 <123> 在这两个查询中都很普遍。有没有办法将这两个查询合并以获取仅在这两个查询中共同出现的主题。 提前致谢。
1个回答

7

是的,加入SPARQL只需要说明具有共同变量的多个模式。因此,我们可以将您的两个查询大部分剪切并粘贴在一起:

SELECT ?subject 
FROM NAMED <http://www.xyz.com/namespace/graph1>
FROM NAMED <http://www.xyz.com/namespace/graph2>
WHERE 
{
  GRAPH <http://www.xyz.com/namespace/graph1> 
  {
    ?subject prefix:hasValue "23" .
  }
  GRAPH <http://www.xyz.com/namespace/graph2> 
  {
    ?subject prefix:hasFeature "23" .
  }
} 

请注意,由于您现在要单独查询两个图形,因此我们需要明确命名每个GRAPH子句的图形。我们不能只使用单个GRAPH ?graph模式,因为它会分别匹配每个命名图并将结果联合在一起,这不符合您所需的语义。
通过此查询,两个图形的结果现在将被合并在一起,因此只有在两个图形中模式匹配时才会返回结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接