【问题标题】:SPARQL query to get instances with only some and not all propertiesSPARQL 查询以获取仅具有部分而不是所有属性的实例
【发布时间】:2016-07-17 23:11:43
【问题描述】:

假设我有三元组

uri:ObjA1 uri:propAA uri:Obj1A .
uri:ObjA1 uri:propAA uri:Obj1B .

uri:ObjA2 uri:propAA uri:Obj1A .
uri:ObjA2 uri:propAA uri:Obj1B .
uri:ObjA2 uri:propAA uri:Obj1C .

现在,我要做的是找到所有只有 propAA 值 Obj1A 和 Obj1B 的实例。基本上,查询应该返回 ObjA1 而不是 ObjA2,因为只有 ObjA1 只为 propAA 取值 Obj1A 和 Obj1B。我现在拥有的是

SELECT * where {
    ?sub uri:propAA uri:Obj1A .
    ?sub uri:propAA uri:Obj1B .
    FILTER NOT EXISTS {
        ?sub uri:propAA ?obj .
        FILTER((?obj != uri:Obj1A) && (?obj != uri:Obj1B)) .
    }
}

现在,此查询有效。如果我不放置 FILTER NOT EXISTS 子句,那么它会同时返回 ObjA1 和 ObjA2。我现在正在寻找的是知道是否有更好的方法来编写这个查询?更好意味着更高效或更简洁(或两者兼而有之)。

【问题讨论】:

    标签: sparql rdf linked-data


    【解决方案1】:

    您可以使用NOT IN 运算符稍微缩短一些内容,也可以使用, 连接器来避免重复三重模式:

    SELECT * where {
        ?sub uri:propAA uri:Obj1A, uri:Obj1B .
        FILTER NOT EXISTS {
            ?sub uri:propAA ?obj .
            FILTER(?obj NOT IN (uri:Obj1A, uri:Obj1B))
        }
    }
    

    我怀疑任何一种更改都会对性能产生影响,但它更简洁,而且(恕我直言)更易于阅读。

    FWIW,这里的双重否定是重写全称量化的经典方法。毕竟,从逻辑上讲,∀x P(x) 等于 ∄x ¬P(x)。由于 SPARQL 没有 FORALL 运算符,因此您必须使用 NOT EXISTS 和双重否定。

    【讨论】:

      【解决方案2】:

      根据三重模式,您正在寻找?sub 的解决方案,其中uri:propAA 的值同时为uri:Obj1Auri:Obj1B。这是 SPARQL 中的基本连词:

      SELECT * 
      WHERE {
         ?sub uri:propAA uri:Obj1A .
         ?sub uri:propAA uri:Obj1B .
      }
      

      【讨论】:

      • 我试过这个查询,但它不起作用。除了 Obj1A 和 Obj1B 之外,它不会忽略那些 propAA 具有其他值的实例。我正在寻找的是只获取那些将 Obj1A 和 Obj1B 作为 propAA 值的实例。任何或多或少的东西都不应该被退回。在我给出的示例中,不应返回 ObjA2,因为除了 Obj1A 和 Obj1B 作为 propAA 的值之外,它还具有 Obj1C 作为 propAA 的值。
      猜你喜欢
      • 2022-11-24
      • 2016-10-26
      • 1970-01-01
      • 2023-03-25
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多