如何在没有UNION / FILTER的情况下使用SPARQL在Apache Jena中获取两个图的内部连接?

时间:2017-10-13 01:50:18

标签: nested sparql jena named-graphs

我有一个基于Apache Jena的本体,我有两个命名图:

M_P

p1    pred1    mp1
p2    pred1    mp1
p3    pred1    mp2
p4    pred1    mp2
p5    pred1    mp3
p6    pred1    mp3

m_p_s

mp1   pred2    w:frnd
mp1   pred2    w:fdlfkdl
mp2   pred2    w:kdsjflk
mp2   pred2    w:jflksdlkj
mp3   pred2    w:frnd
mp3   pred2    w:fjksldjfls

我希望获得 m_p 中的所有三元组,这些对象是 m_p_s 中的谓词和 m_p_s 中谓词的对象是 w:frnd

换句话说,我想进行返回(结果) p1 p2 p5 p6 来自 m_p ,但不会返回 p3 p4

我正在尝试使用嵌套查询执行此操作,但它不起作用:例如。

SELECT $subj $pred $pr
FROM NAMED named_graph:m_p
WHERE
{
    SELECT $pr
    WHERE
    {
       GRAPH named_graph:m_p_s { $pr $pred0 w:frnd }
    }
}

返回空结果。我尝试了不同的方法,但我得到错误或空洞的结果或 m_p 中的所有内容。

出于性能原因,我不想使用 UNION FILTER

你知道我该怎么办吗?

此致 斯蒂芬

2 个答案:

答案 0 :(得分:2)

内部SELECT不是必需的:它隐藏了第二次使用?p但可以使用不同的名称来完成:

SELECT ?s ?p ?o
FROM named_graph:m_p
FROM NAMED named_graph:m_p_s
{
   ?s ?p ?o
   GRAPH named_graph:m_p_s { ?o ?px w:frnd }
}

答案 1 :(得分:1)

我不明白你的意思"我想得到m_p中的所有三元组,哪些对象是m_p_s"中的谓词。如果你的意思是"其对象是m_p_s"中的主题,那就更有意义了:

SELECT *
FROM named_graph:m_p
FROM NAMED named_graph:m_p_s
WHERE
{
  ?s ?p ?o
  {
     SELECT ?o WHERE {
       GRAPH named_graph:m_p_s { ?o ?p w:frnd }
      }
  }
}