繁体   English   中英

SPARQL查询只获取一些而不是所有属性的实例

[英]SPARQL query to get instances with only some and not all properties

假设我有三倍的形式

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。 我现在要找的是知道是否有更好的方法来编写这个查询? 更好的意思是,更有效或更简洁(或两者兼而有之)。

以三重模式表示,您正在寻找?sub的解决方案,其中uri:propAA值都是uri:Obj1Auri:Obj1B 这是SPARQL中的基本结合:

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

你可以缩短的事情略有使用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)等于∄x ¬P(x) 由于SPARQL没有FORALL运算符,因此必须使用NOT EXISTS和双重否定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM