【问题标题】:What RDF patterns can be used to represent components and the percentage they make up?哪些 RDF 模式可用于表示组件以及它们构成的百分比?
【发布时间】:2017-05-26 20:41:08
【问题描述】:

我想使用 RDF 清点我的葡萄酒收藏,但不确定如何指定葡萄酒可以包含多种葡萄品种的百分比。下面是在 Turtle 语法中使用 rdf:bag 的尝试。

@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 模式和本体来解决这个问题。也就是说,在我完全理解我为什么需要之前,我也不想跳槽。

如果可能,如何使用 RDF 来表示葡萄酒具有一定百分比的不同品种?

【问题讨论】:

  • 你必须为包中的每个项目使用一个空白节点或URI,然后你可以将相应的信息附加到项目上,例如。 rdf:_1 vin:entry1vin:entry1 rdfs:label "Cabernet Sauvignon"@en ; vin:grapePortion "0.76"^^xsd:decimal .
  • 这很好用。我所做的另一项更改是将rdf:Bag 替换为rdf:Seq,以便输入时,品种将从最大百分比到最小百分比排序。

标签: rdf ontology semantic-web linked-data


【解决方案1】:

我更喜欢使用这个简单的模式:

@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 进行强烈识别,它们的“本体论地位”不够稳固。因此,我使用空白节点。

【讨论】:

  • W3C 的葡萄酒本​​体一直是很好的启发。在可能的情况下,我会接受建议使用事物来代替字符串。非常感谢您提供示例查询。这些表明葡萄品种和百分比之间的关联足够强。我相信我理解为什么使用给定的易于阅读和理解的属性路径比rdfs:containers 需要的更可取。
  • @Kelly,我认为rdf:Seq 在描述鸡尾酒等时会很合适。
  • 有趣的想法,但我不确定我是否理解。你的意思是葡萄酒的成分,它的葡萄品种,与鸡尾酒的成分有那么大的不同吗?鸡尾酒配方通常不会列出成分的百分比,但也可以。
  • @Kelly,我的意思是分层鸡尾酒,其中层的确切顺序很重要。例如,血腥玛丽:首先是伏特加,其次是番茄汁(我记得)。虽然,可能,人们可以从它们的密度中推断出适当的成分顺序,即。 e.省去rdf:Seq
  • 我想我现在明白了。葡萄酒仅由葡萄制成,而鸡尾酒(以及啤酒)则由不止一种物质组成。我还会考虑类似于vin:varietal 的使用方式,beer:yeastbeer:grainbeer:hopsbeer:otherAdditives 属性可以使用。
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 2011-05-04
  • 2010-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多