加入 SPARQL 查询

use*_*324 2 sparql

我在 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>
---------------------
Run Code Online (Sandbox Code Playgroud)

现在我想运行 SPARQL 查询以获得两个图中常见的结果。

假设如果我对一张图运行以下查询,我会得到以下结果

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

<123>
<374>
---
---
---
Run Code Online (Sandbox Code Playgroud)

如果对 graph2 运行以下第二个查询,我会得到以下信息

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

<244>
<123>
-----
Run Code Online (Sandbox Code Playgroud)

但是我想要在两个查询中都很常见的主题 <123> 。我们可以通过任何方式组合两个查询来获得两个查询中唯一的主题。提前致谢。

Rob*_*obV 5

是的,加入 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" .
  }
} 
Run Code Online (Sandbox Code Playgroud)

请注意,由于您现在要分别查询这两个图,因此我们需要为每个GRAPH子句显式命名该图。我们不能只使用单个GRAPH ?graph模式,因为它单独匹配每个命名图并将结果联合在一起,这不具有您想要的语义。

使用此查询,两个图形的结果现在将连接在一起,因此您只会获得两个图形中模式匹配的结果。