Compare models for identity, but with variables? Construct with minus?

情到浓时终转凉″ 提交于 2019-12-02 03:30:49

问题


My team is implementing a variation of Ceusters's Referent Tracking. In our implementation, the original URI for an entity can be changed (to something containing a UUID), although a link to the original URI is always kept.

For example:

:Joey rdf:type :person .
:New_York_City  rdf:type :locality .
:Joey :hometown :New_York_City .

might become:

:Joey :replacedWith :ABC123 .
:ABC123 rdf:type :person .
:New_York_City  :replacedWith :FFF555 .
:FFF555  rdf:type :locality .
:ABC123 :hometown :FFF555 .

I am writing some Scala integration tests to see if our software does the referent tracking correctly.

Specifically, I know I should expect this CorrectPattern:

:Joey :replacedWith ?person .
?person rdf:type :person .
:New_York_City  :replacedWith ?locale .
?locale  rdf:type :locality .
?person :hometown ?locale .

But I don't know what the values of ?person and ?locale will be.

I can SPARQL ASK for CorrectPattern... that will tell me if the pattern is present. But I also want to confirm that nothing else has been added.

I thought I could CONSTRUCT { ?s ?p ?o }, MINUS out CorrectPattern, and check for an empty result, but Blazegraph is saying:

java.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: CONSTRUCT WHERE only permits statement patterns in the WHERE clause.

Any ideas? I want to check that the whole triple store contains nothing more and nothing less than CorrectPattern, but I think CorrectPattern must contain variables.


回答1:


Once again bailed out by a comment from @AKSW, who doesn't seem to be especially obsessed with earning reputation points.

This CONSTRUCT, with an embedded SELECT, gets all triples from my model, depleted of any triples in the MINUS block, even when they contain variables. I'm pretty sure I can flesh out the MINUS block and finish my task.

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 }
      }
  }



回答2:


In order to determine that the triple-store contains only the triples which you expect and nothing more, you could test for the exact triples which you expect while simultaneously counting the number of triples which appear in the database before and after you run your program. If the difference in triples is higher or lower than you expect, you will know that you have some extraneous or missing data.

Use SPARQL SELECT Count function:

SELECT (count(?triples) as ?count)
WHERE {
?triples ?p ?o .}

Pseudocode:

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

Additionally, if you are resistant to using variables in your tests, you could write additional queries to capture the URI of the node you have created, then add the results to your test queries using String concatenation.



来源:https://stackoverflow.com/questions/44724693/compare-models-for-identity-but-with-variables-construct-with-minus

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!