我正在尝试创建一个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:seq
和ssb: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要么因为模式不存在而不匹配,要么因为模式存在时被过滤掉了。