我在 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> 。我们可以通过任何方式组合两个查询来获得两个查询中唯一的主题。提前致谢。
是的,加入 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模式,因为它单独匹配每个命名图并将结果联合在一起,这不具有您想要的语义。
使用此查询,两个图形的结果现在将连接在一起,因此您只会获得两个图形中模式匹配的结果。