比较模型的身份,但与变量?用减号构造?

时间:2017-06-23 15:08:25

标签: scala sparql rdf sesame blazegraph

我的团队正在实施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必须包含变量。

2 个答案:

答案 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,然后使用字符串连接将结果添加到测试查询中。