2

我的团队正在实施Ceusters 的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 }, MINUSoutCorrectPattern并检查空结果,但 Blazegraph 说:

java.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: CONSTRUCT WHERE 只允许 WHERE 子句中的语句模式。

有任何想法吗?我想检查整个三重商店是否包含更多和更少CorrectPattern,但我认为CorrectPattern必须包含变量。

4

2 回答 2

3

再次被@AKSW 的评论所拯救,他似乎并不特别痴迷于赚取声誉积分。

thisCONSTRUCT带有嵌入的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 }
      }
  }
于 2017-06-23T19:50:54.980 回答
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,然后使用字符串连接将结果添加到您的测试查询中。

于 2017-06-23T15:41:02.220 回答