rdf - 如何使用 foaf 指定类属性
问题描述
我想创建一个本体来描述社交网络中用户之间的交互,并且我想将其导入 GraphDB。我决定使用词汇表来利用其中已经定义的资源。我正在创建本体的架构,并将User类开发为foaf:Person的类型,每个用户都有一个字符串名称,所以我想使用foaf:name属性在用户类中添加这个关系。
我的问题是,由于这不是用户的实例,我应该在谓词foaf:name旁边的类描述中使用什么对象?
@prefix : <http://xmlns.com/swp/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/TR/rdf-schema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
# BASE INFORMATION
:User a foaf:Person ;
rdfs:label "User" ;
rdfs:comment "A person who has got an account" ;
foaf:name ??? ;
foaf:title :EducationalQualification .
编辑 我认为也许正确的对象可能是xsd:string:
:User a foaf:Person ;
rdfs:label "User" ;
rdfs:comment "A person who has got an account" ;
foaf:name xsd:string ;
foaf:title :EducationalQualification .
解决方案
我建议学习RDF Schema以了解如何编写自己的基本词汇表。你不需要使用其中的任何一个,但它对于任何想要使用或理解你的自定义词汇的人来说肯定是有用的。
现在让我们考虑问题域。您有具有姓名和头衔的用户。你希望你的名字是纯字符串,你的标题是:EducationalQualification
. 让我们尝试表达这一点,而不是使用而是扩展FOAF。
首先,你想表达every :User
是一个foaf:Person
。写作:User a foaf:Person
是不正确的,因为这意味着由 标识的资源:User
是一个人的特定实例,它不是——它是一个类!
:User a rdfs:Class ;
rdfs:subClassOf foaf:Person .
这是对新类的一个很好的定义——由此有人可以推断出数据集中的用户可以被视为 FOAF 人。
对于人名,我认为rdf:langString
(即语言标记的字符串)对于人名来说是一个更好的类,特别是如果你使用foaf:name
,所以我会使用它(但无论如何使用没有区别)。
:name a rdf:Property ;
rdfs:domain :User ;
rdfs:range rdf:langString ;
rdfs:subPropertyOf foaf:name .
这又很简单::name
是一个可以(必须)附加到 a:User
并且具有(必须)值为 的属性rdf:langString
。如果任何两个资源通过此属性链接,则意味着它们也链接foaf:name
(由于子属性)。
标题相同:
:title a rdf:Property ;
rdfs:domain :User ;
rdfs:range :EducationalQualification ;
rdfs:subPropertyOf foaf:title .
您的初衷是表达通过foaf:title
a附加的任何:User
内容:EducationalQualification
。这也可以表达,但你需要比 RDFS 更强大的东西,比如 OWL:
@prefix owl: <http://www.w3.org/2002/07/owl#> .
[ a owl:Restriction ;
owl:onProperty [ owl:inverseOf foaf:title ] ;
owl:someValuesFrom :User
] rdfs:subClassOf :EducationalQualification .
但是,我认为这不是一个好主意,因为它会foaf:title
以意想不到的方式进行修改。如果您有专门的含义,最好使用专门的属性。
推荐阅读
- reactjs - 无法在我的父组件中呈现作为 prop.children 接收的组件
- postgresql - 如何计算给定日期范围内的间隔数?更简单的版本
- javascript - 为什么 Date.now() 是一个非纯函数?
- javascript - Angularjs嵌套选项卡绑定到json
- javascript - 全局变量未在函数内更新
- postgresql - 使用包含状态字段的复合主键优化数据集
- javascript - 该 css 文件未出现在检查谷歌中
- linux - Tomcat 重启时启动:init.d 脚本不成功
- mysql - Spring Boot JPA 一对一映射生成 StackOverflow 错误
- java - 如何通过 RestAPI 使用 commitId 从 Bitbucket 下载文件?