這是我的問題Compare models for identity, but with variables? Construct with minus?的後續。要麼我忘了當時學到的東西,要麼我沒有像以前那樣學習。sparql「diff」(減去一些非共享變量)
我有三元這樣的:
prefix : <http://example.com/>
:rose :color :red .
:violet :color :blue .
:rose a :flower .
:flower rdfs:subClassOf :plant .
:dogs :love :trucks .
我想找到我的triplestore任何三元不滿足的至少一個規則:
- 採取
:rose
爲主題 - 以
:rose
的父級爲主題 - 使用任何謂詞了在任何三重使用
:rose
作爲受試者 - 取,因爲它們的對象,任何三重的對象與
:rose
作爲受試者的。
因此,在這種情況下,異常發現查詢(選擇或構建)應僅返回
:dogs :love :trucks .
該查詢顯示了應該是在triplestore:
PREFIX : <http://example.com/>
construct where {
:rose ?p ?o .
:rose a ?c .
?c rdfs:subClassOf ?super .
?s ?p ?x1 .
?x2 ?x3 ?o
}
。
+---+---------+-----------------+---------+
| | subject | predicate | object |
+---+---------+-----------------+---------+
| A | :flower | rdfs:subClassOf | :plant |
| B | :rose | :color | :red |
| C | :rose | rdf:type | :flower |
| D | :violet | :color | :blue |
+---+---------+-----------------+---------+
有沒有辦法減去該模式出一切在triplestore,{ ?s ?p ?o }
,即使我用比?s
,在construct
聲明?p
和?o
其他變量的名字呢?
我看過this post與比較RDF的策略,但我想用標準的SPARQL來做。
爲了與我之前發佈的帖子結合在一起,這個最終查詢錯誤地暗示了幾個期望的三元組違反了在消息頂部設置的規則。
+---------+-----------------+---------+
E | :dogs | :love | :trucks |
A | :flower | rdfs:subClassOf | :plant |
D | :violet | :color | :blue |
+---------+-----------------+---------+
Triple E確實是不受歡迎的。但A被需要的,因爲它的:rose
類作爲其主題(規則2)和三d是需要的,因爲它是謂語在某些三元與也使用:玫瑰作爲主題( 規則3)。
PREFIX : <http://example.com/>
CONSTRUCT
{
?s ?p ?o .
}
WHERE
{ SELECT ?s ?p ?o
WHERE
{ { ?s ?p ?o }
MINUS
{ :rose ?p ?o ;
rdf:type ?c .
?c rdfs:subClassOf ?super .
?s ?p ?x1 .
?x2 ?x3 ?o
}
}
}
你能澄清一下嗎? 「如果我的三重奏包含任何違反這些規則的三元組:1.不是關於:玫瑰2 ...」三倍的規則應該是關於玫瑰的規則(並且由此,你的意思是「玫瑰是主題」或「玫瑰是主體還是客體(或謂詞)」),還是他們不應該?編寫SPARQL查詢通常不會太難,它會發現違反某些規則的情況,但它需要清楚規則**是什麼**。 –
謝謝。當您發佈時,我正在處理那個模糊的部分!現在好點了嗎?我還有更多不良行爲**的例子。 –
問題是,'MINUS'形成(像往常一樣)一組求解序列,而不是一組三元組。事實上,它不會工作,特別是因爲你沒有共享變量,但在這裏更重要的是你不減去SELECT查詢中的三元組。 – AKSW