0

我有一个基于 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

换句话说,我想进行从m_p返回(结果) p1p2p5p6并且不返回p3p4的查询。

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

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中的所有内容。

出于性能原因,我不想使用UNIONFILTER 。

你知道我该怎么做吗?

问候,斯特凡

4

2 回答 2

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 }
}
于 2017-10-13T10:47:33.493 回答
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 }
      }
  }
}
于 2017-10-13T09:51:32.770 回答