我的团队正在实施Ceusters's Referent Tracking的变体。在我们的实现中,可以更改实体的原始URI(包含UUID的内容),但始终保留指向原始URI的链接。
例如:
:Joey rdf:type :person .
:New_York_City rdf:type :locality .
:Joey :hometown :New_York_City .
可能会成为:
:Joey :replacedWith :ABC123 .
:ABC123 rdf:type :person .
:New_York_City :replacedWith :FFF555 .
:FFF555 rdf:type :locality .
:ABC123 :hometown :FFF555 .
我正在编写一些Scala集成测试,以查看我们的软件是否正确执行了所需的跟踪。
具体来说,我知道我应该期待这个CorrectPattern
:
:Joey :replacedWith ?person .
?person rdf:type :person .
:New_York_City :replacedWith ?locale .
?locale rdf:type :locality .
?person :hometown ?locale .
但我不知道?person
和?locale
的价值是什么。
我SPARQL ASK
CorrectPattern
可以告诉我模式是否存在。但我也想确认没有添加任何其他内容。
我以为我可以CONSTRUCT { ?s ?p ?o }
,MINUS
CorrectPattern
,然后查看空结果,但Blazegraph说:
java.util.concurrent.ExecutionException:org.openrdf.query.MalformedQueryException:CONSTRUCT WHERE只允许WHERE子句中的语句模式。
有什么想法吗?我想检查整个三元组商店是否只包含CorrectPattern
,但我认为CorrectPattern
必须包含变量。
答案 0 :(得分:3)
再一次被@AKSW的评论拯救出来,@AKSW似乎并不特别痴迷于赢得声望点。
此CONSTRUCT
具有嵌入式SELECT
,从我的模型中获取所有三元组,即使它们包含变量,也会耗尽MINUS
块中的任何三元组。我很确定我可以充实MINUS
块并完成我的任务。
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
CONSTRUCT
{
?s ?p ?o .
}
WHERE
{ SELECT ?s ?p ?o
WHERE
{ { ?s ?p ?o }
MINUS
{ ?s rdf:type ?o }
}
}
答案 1 :(得分:1)
为了确定三重存储仅包含您期望的三元组,您可以测试您期望的精确三元组,同时计算在运行之前和之后数据库中出现的三元组数量你的计划。如果三元组的差异高于或低于您的预期,您将知道您有一些无关或缺失的数据。
使用SPARQL SELECT
计数功能:
SELECT (count(?triples) as ?count)
WHERE {
?triples ?p ?o .}
伪代码:
val beforeTripleCount = countTriplesInDatabase()
//run your program, test for expected triples
val afterTripleCount = countTriplesInDatabase()
val diff = afterTripleCount - beforeTripleCount
//diff should be equal to the number of triples you expect to be added/removed
此外,如果您不能在测试中使用变量,则可以编写其他查询来捕获已创建的节点的URI,然后使用字符串连接将结果添加到测试查询中。