什么样的RDF模式可以用来表示组件以及它们组成的百分比?

问题描述:

我想用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

我宁愿用这个简单的模式:

@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