【问题标题】:select all triples, indicating named graph if relevant选择所有三元组,如果相关,则指示命名图
【发布时间】:2018-03-08 05:51:54
【问题描述】:

假设我在我的 GraphDB 8.3 三元存储中进行了以下插入:

PREFIX : <http://example.com/>
insert data { :hello a :word }

PREFIX : <http://example.com/>
insert data { graph :farewells { :goodbye a :word }}

现在,如果我问

select * where {
    graph ?g {
        ?s ?p ?o .
    } 
}

我只会得到

+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
|               ?g               |              ?s              |                        ?p                         |            ?o             |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+
| <http://example.com/farewells> | <http://example.com/goodbye> | <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> | <http://example.com/word> |
+--------------------------------+------------------------------+---------------------------------------------------+---------------------------+

我显然可以通过以下方式获得“关于单词的三元组”,但是没有显示命名图成员身份

select * { ?s ?p ?o }

如何编写一个查询来检索关于单词的两个三元组并指示{ :goodbye a :word } 来自图形:farewells

【问题讨论】:

    标签: sparql rdf graphdb named-graphs


    【解决方案1】:

    您可以按照以下方式做一些事情:

    SELECT * 
    WHERE {
       { GRAPH ?g { ?s ?p ?o } }
       UNION
       { ?s ?p ?o .
         FILTER NOT EXISTS { GRAPH ?g { ?s ?p ?o } } 
       }
    }
    

    联合的第一部分选择命名图中的所有三元组。第二部分抓取默认图中的所有三元组,明确排除命名图中出现的模式。

    【讨论】:

      【解决方案2】:

      在 GraphDB 中,您可以为此目的使用 pseudographs,即。 e. &lt;http://www.ontotext.com/explicit&gt;(看来你没有使用推理)。

      试试这个查询:

      SELECT * FROM NAMED <http://www.ontotext.com/explicit>
      { GRAPH ?g { ?s ?p ?o } }
      

      结果应该是:

      +------------------------------------+----------+-----------+-------+
      | ?g                                 | ?s       | ?p        | ?o    |
      +------------------------------------+----------+-----------+-------+
      | <http://www.ontotext.com/explicit> | :hello   | rdf:type  | :word |
      | :farewells                         | :goodbye | rdf:type  | :word |
      +------------------------------------+----------+-----------+-------+
      

      为了比较,请注意

      SELECT * FROM NAMED <http://www.openrdf.org/schema/sesame#nil>
      { GRAPH ?g { ?s ?p ?o } }
      

      只会返回

      +------------------------------------+----------+-----------+-------+
      | ?g                                 | ?s       | ?p        | ?o    |
      +------------------------------------+----------+-----------+-------+
      | <http://www.ontotext.com/explicit> | :hello   | rdf:type  | :word |
      +------------------------------------+----------+-----------+-------+
      

      【讨论】:

        【解决方案3】:

        简短的“答案”:避免将数据放入 GraphDB 中的默认图(以及其他具有“虚拟”默认图的三元组存储,它只是所有命名图的 UNION)

        背景:GraphDB 决定将默认图定义为所有命名图和默认图的并集。此行为不受 SPARQL 语义规范的支持,而是特定于实现的行为。

        所以你真的有三个选择:

        1. 按照 Jeen Broekstra 的说明,使用“过滤器不存在”或“减号”。这可能会对查询性能产生严重负面影响。

        2. 使用 Stanislav Kralin 示例的 GraphDB 伪图。此选项使您的查询(和您的系统)依赖于 GraphDB——您以后无法更改 SPARQL 引擎,而无需调整您的查询。

        3. 避免将数据放入默认图表。您可以定义“您自己的”默认图表,例如将其命名为http://default/,并将其放在 SPARQL FROM 子句中。

        其他三重存储允许启用/禁用此功能。我在 GraphDB 的文档中找不到开关。否则,这将是第四个,也是我的首选。

        【讨论】:

        • @StanislavKralin 是的,它被允许作为服务描述的一部分。但是 SPARQL 的语义不是这样定义的。虽然我了解此功能的目的,但它可能会使 SPARQL 用户感到困惑。我相应地澄清了答案。
        猜你喜欢
        • 1970-01-01
        • 2013-06-21
        • 1970-01-01
        • 2013-02-02
        • 2012-07-31
        • 1970-01-01
        • 2018-06-26
        • 2014-03-08
        • 1970-01-01
        相关资源
        最近更新 更多