RDF / TTL中大多数三元组的例子都是非常具体的,与术语相关:
有时允许使用替代方法,例如:
但是我想在RDF中表达这样的内容:
或更一般的说法
因此,对象仅受某种类别的限制,或者根本不受限制。
正确的方法是什么?
答案 0 :(得分:0)
如何执行此操作很大程度上取决于您要建模的域,您要使用该模型的内容以及您要传达的准确。不幸的是,您的简单示例实际上并不像它们看上去的那么简单。例如:
狗吃牛排
您是说有一条特定的狗在吃牛排,还是一般来说所有狗都在吃牛排?如果是后者:您的意思是说狗从不吃牛排,而牛排是狗吃的东西之一?所有的狗都总是吃东西吗,还是有些狗根本不吃东西?在概念建模中保持精确的要点。
因此,假设我们实际要说的是“每条狗都吃东西,那就是牛排,这是对的,”我们可以使用RDF Schema表示如下:
my:Dog a rdfs:Class .
my:Steak a rdfs:Class .
my:eats a rdf:Property ;
rdfs:domain my:Dog ;
rdfs:range my:Steak .
实际上,我们在这里甚至说的更多:我们不仅说如果狗吃东西,那东西就是牛排,我们还说,如果有人吃东西,那人就是狗。换句话说,只有狗可以吃任何东西,而他们只能吃的牛排。
所以,这可能太简单了,对吧?
要对更复杂的“如果狗吃东西,一定是牛排”建模,而不会自动暗示任何吃东西的人都是狗,我们可以使用Web本体语言OWL,并使用属性限制:
my:Dog a owl:Class ;
rdfs:subClassOf [ a owl:Restriction ;
owl:onProperty my:eats ;
owl:allValuesFrom my:Steak ].
这字面意思是“狗的类别是仅吃牛排的所有事物的类别的子类别”。
...当然,还有其他更复杂的方式可以对其他类型的语句和限制进行建模。如果您想了解更多有关如何做这种事情的知识,建议您浏览一下在线提供的许多有关RDF / OWL本体建模的教程之一。
当然,就像我在开始时说的那样,是否需要这种建模取决于您的应用程序以及您打算使用此模型的目的。在某些情况下,在RDF中只说这样的话是完全可以的:
my:Dog a my:Animal .
my:Meat a my:Food .
my:Dog my:eats my:Meat .
my:Goat my:eats my:Food .
但是,使用更具表现力的RDFS / OWL词汇表对类和关系建模有很多好处,特别是在重用数据集以及现有工具(例如推理机和查询引擎)如何利用它方面。