在没有UNION/FILTER的情况下,如何使用SPARQL在ApacheJena中获得两个图的内部联接



我有一个基于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返回p1p2p6(结果),而不返回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

你知道我该怎么做吗?

谨致问候,Stefan

内部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 }
}

我不明白你所说的"我想得到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 }
}
}
}

相关内容

  • 没有找到相关文章

最新更新