2017-05-26 27 views
3

我想用RDF清點我的葡萄酒收藏,但不知道如何指定葡萄酒可以包含幾個葡萄品種的百分比。下面是使用rdf:bag在Turtle語法中做的一個嘗試。什麼樣的RDF模式可以用來表示組件以及它們組成的百分比?

@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix vin: <http://example.org/wine#> . 

<http://example.org/wine/id#1001> 
    a <http://example.org/wine/ns#red> ; 
    vin:name "Quilceda Creek CVR" ; 
    vin:vintage "2014"^^xsd:gYear ; 
    vin:winery "Quilceda Creek"@en ; 
    vin:alcoholContent "0.15"^^xsd:decimal ; 
    vin:agedIn "French Oak"@en ;  

    vin:varietals rdf:_1, rdf:_2, rdf:_3, rdf:_4, [ 
    a rdf:Bag ; 
    rdf:_1 "Cabernet Sauvignon"@en ; 
    rdf:_1 "0.76"^^xsd:decimal ; 
    rdf:_2 "Merlot"@en ; 
    rdf:_2 "0.20"^^xsd:decimal ; 
    rdf:_3 "Petit Verdot"@en ; 
    rdf:_3 "0.03"^^xsd:decimal ; 
    rdf:_4 "Malbec"@en ; 
    rdf:_4 "0.01"^^xsd:decimal ; 
    ] . 

當我將它轉換爲XML/RDF時,百分比的三元組被丟棄。這讓我覺得你不應該/不能多次使用袋子項目謂詞(例如rdf:_1)。

我也考慮過製作一袋袋子,每袋裝一個包含名稱和百分比的品種。這將涉及創建更多的空白節點,這對我來說似乎不正確。最終,我希望能夠檢索到所有含有特定品種至少一定百分比的葡萄酒。我不確定如果品種名稱和百分比對沒有定義的關係,而不是定義在同一個包中,是否能夠。

我是新來的,但有一種感覺,我需要看看RDF Schema和本體的這個問題。也就是說,我也不想跳槽,直到我完全明白爲什麼我需要。

如果可能,RDF如何用來表示葡萄酒具有不同品種的某些百分比?

+0

您必須爲袋子中的每個物品使用空白節點或URI,然後才能將相應信息附加到物品上。 'rdf:_1 vin:entry1'和'vin:entry1 rdfs:label「Cabernet Sauvignon」@en; vin:grapePortion「0.76」^^ xsd:decimal .' – AKSW

+0

這個效果很好。我做了一個額外的修改,就是用'rdf:Seq'替換'rdf:Bag',這樣輸入的數據就會從最大到最小的百分比排列。 – Kelly

回答

3

我寧願用這個簡單的模式:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix wine: <http://www.w3.org/TR/2003/PR-owl-guide-20031209/wine#> . 
@prefix vin: <http://example.org/wine#> . 

vin:id1001 vin:varietal [ vin:grape wine:CabernetSauvignonGrape; 
          vin:percentage "0.76"^^xsd:decimal ] ; 
      vin:varietal [ vin:grape wine:MerlotGrape ; 
          vin:percentage "0.20"^^xsd:decimal ] . 

與模式實例SPARQL查詢上面會:

SELECT DISTINCT ?sophistique 
WHERE { 
    ?sophistique vin:varietal/vin:percentage ?percentage . 
    FILTER (?percentage <= "0.05"^^decimal) 
} 
SELECT DISTINCT ?coupage 
WHERE { 
    ?coupage vin:varietal/vin:grape ?grape1. 
    ?coupage vin:varietal/vin:grape ?grape2. 
    FILTER (?grape1 != ?grape2) 
} 
SELECT ?id (("1.0"^^xsd:decimal - SUM(?percentage)) AS ?part_des_anges) 
WHERE { 
    ?id vin:varietal/vin:percentage ?percentage . 
} GROUP BY ?id HAVING (?part_des_anges > "0.0"^^xsd:decimal) 

一些言論:

  1. 在任何可能的情況下,使用RDF中的字符串而不是字符串在思想上更爲正確。
    W3C的例子wine ontology可以提供許多這些東西的URI。

  2. 爲什麼不使用多次出現的vin:varietal屬性而不是rdf:Seq?在SPARQL中處理rdfs:Container將更加困難,特別是在OWL中。

  3. 我不認爲這些葡萄品種(百分比葡萄品種)需要對URI進行強有力的識別,它們的「本體論狀態」並不足夠穩固。因此,我使用空白節點。

+1

W3C的葡萄酒本​​體具有很好的靈感。在可能的情況下,我會採取建議來代替字符串。非常感謝您的示例查詢。這些證明了葡萄品種和百分比之間的關聯性足夠強。我相信我明白爲什麼使用容易閱讀和理解的屬性路徑(如給出的)會優於'rdfs:containers'所需的屬性路徑。 – Kelly

+0

@Kelly,我認爲'rdf:Seq'將會適用於描述雞尾酒等。 –

+0

有趣的想法,但我不知道我明白。你的意思是說,葡萄酒的組成部分,其葡萄品種與雞尾酒的組成部分有很大不同?雞尾酒食譜通常不會列出含有百分比的成分,但也可以。 – Kelly

相關問題