【问题标题】:How can I get inner join of two graphs in Apache Jena with SPARQL without UNION/FILTER?如何在没有 UNION/FILTER 的情况下使用 SPARQL 在 Apache Jena 中获得两个图的内部连接?
【发布时间】:2017-10-13 01:50:18
【问题描述】:

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

换句话说,我想进行返回(结果为)p1p2p5p6 的查询strong> 来自 m_p 并且不返回 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

你知道我该怎么做吗?

问候, 斯蒂芬

【问题讨论】:

  • 注意:我跳过了前缀声明以缩短帖子的可读性。例如。 'named_graph' 是带有 URI ao.com/namedGraph> 的前缀
  • 您的外部查询没有选择任何三元组模式。 $subj$pred 的绑定从哪里来?因此,子SELECT之前不应该有?subj ?pred ?pr吗? IE。 SELECT ?subj ?pred ?pr FROM NAMED named_graph:m_p WHERE { ?subj ?pred ?pr { SELECT ?pr WHERE { GRAPH named_graph:m_p_s { ?pr ?pred0 w:frnd } } } }我回来后会在 2 小时内测试它,也许图表还缺少一些东西
  • 请不要缩短查询 - 确保可以剪切和粘贴,以便读者准确了解您使用的内容。

标签: nested sparql jena named-graphs


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      相关资源
      最近更新 更多