SPARQL:条件插入



我正在尝试创建一个SPARQL语句,仅当某个模式尚未在图中时才插入一些三元组。

PREFIX ssb: <ssb:ontology:>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT {
<ssb:message/some=> rdf:type ssb:Message;
ssb:seq 7;
ssb:raw "some text";
ssb:author 1.
} WHERE {
FILTER NOT EXISTS {
[] ssb:seq 7; ssb:author 1
}
}

不幸的是,这似乎创建了新的三元组,即使具有ssb:seqssb:author的资源已经存在,尝试使用quadstorejs和oxigraph。

关于如何执行这样的条件插入有什么建议吗?这样做的目的是不让几个资源具有相同的序列号和作者。

我相信你的第一次尝试是正确的,它看起来像是你尝试的系统中的一个错误。

的代数
FILTER NOT EXISTS {
[] ssb:seq 7; ssb:author 1
}

是直接在Singleton之上的FILTER,当[] ssb:seq 7; ssb:author 1不匹配数据时,它必须返回单个(空)解决方案。因为INSERT模板中没有变量,所以应该插入数据。

带有OPTIONAL的版本没有太大的不同,在OPTIONAL之前有一个隐式的{},它是相同的Singleton。

我刚刚尝试了CONSTRUCT版本的你的第一个查询与星狗,它工作如预期。

我找到了一个似乎有效的解决方案:

PREFIX ssb: <ssb:ontology:>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
INSERT {
<ssb:message/some=> rdf:type ssb:Message;
ssb:seq 7;
ssb:raw "some text";
ssb:author 1.
} WHERE {
OPTIONAL {?x ssb:seq 7; ssb:author 1.}
FILTER (!BOUND(?x))
}

不确定确切原因。我的意思是WHERE-Clause要么因为模式不存在而不匹配,要么因为模式存在时被过滤掉了。

相关内容

  • 没有找到相关文章