2017-08-09 43 views
1

這是我的問題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任何三元不滿足的至少一個規則

  1. 採取:rose主題
  2. :rose的父級爲主題
  3. 使用任何謂詞了在任何三重使用:rose作爲受試者
  4. 取,因爲它們的對象,任何三重的對象: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 
      } 
     } 
    } 
+0

你能澄清一下嗎? 「如果我的三重奏包含任何違反這些規則的三元組:1.不是關於:玫瑰2 ...」三倍的規則應該是關於玫瑰的規則(並且由此,你的意思是「玫瑰是主題」或「玫瑰是主體還是客體(或謂詞)」),還是他們不應該?編寫SPARQL查詢通常不會太難,它會發現違反某些規則的情況,但它需要清楚規則**是什麼**。 –

+0

謝謝。當您發佈時,我正在處理那個模糊的部分!現在好點了嗎?我還有更多不良行爲**的例子。 –

+0

問題是,'MINUS'形成(像往常一樣)一組求解序列,而不是一組三元組。事實上,它不會工作,特別是因爲你沒有共享變量,但在這裏更重要的是你不減去SELECT查詢中的三元組。 – AKSW

回答

4

如果我理解正確的這個,你要允許四種類型的三元組中的數據。如果一個三元組(S,P,O)是在你的數據時,它應當滿足下列標準中的至少一個:

  1. S =玫瑰(關於玫瑰)
  2. P = RDFS:subClassOf的和數據包含(玫瑰,A,S)(關於一個類型)
  3. 數據還包含(玫瑰,p,X)(共享謂詞)
  4. 數據還包含(玫瑰,q,鄰)(共享對象)

很容易爲每一個模式寫一個模式。你只需要找出每個三元組(s,p,o)並過濾掉那些不符合那些標準的元組。我認爲你可以這樣做:

select ?s ?p ?o { 
    ?s ?p ?o 
    filter not exists { 
      { values ?s { :rose } }      #-- (1) 
    union { values ?p { rdfs:subClassOf } :rose a ?s } #-- (2) 
    union { :rose ?p ?x }        #-- (3) 
    union { :rose ?x ?o }        #-- (4) 
    } 
} 
+0

這確實是一個正確答案:D適用於我(用Stardog 5.x測試):'(s,p,o):(:flower,rdfs:subClassOf,:plant)| (:狗,:愛,:卡車)'確實自動生成這種查詢可能會更困難,但我想這不是問題。乾杯! – AKSW

+0

**按照Blazegraph 2.1.1的要求工作** *在GraphDB Free 8.2.0中返回0個三元組* * –

+0

也許GraphDB在'FILTER NOT EXISTS'內部有'VALUES'問題,這在很少用到組合 - 但誰知道。 – AKSW