我的语义Web项目中有一个RDF文件,我使用Rowlex来操作它。 我需要从RDF中删除一个人,所以我使用了
<RDFDoc instance>.RemoveIndividual(new OwlThing(<individual URI>, <RDFDoc instance>));
使用这段代码,我的个人不见了,但它的属性仍然存在。所以我发现我应该首先删除它的属性。此外,我没有找到一起删除所有属性的命令。那么,问题1 :有没有办法删除具有所有属性的个人?或者,我可以删除一行代码中的所有属性而不是逐个删除吗?如何删除具有多个值的属性。例如三个StudyLists,例如下页。
另一方面,当我尝试从学生个人中移除一个属性时,例如'useSudyList',通过以下代码:
student.RemoveuseStudyList(student.useStudyList);
我找到了我的RDF文件:
<Ontologyowl:Student rdf:about="ehsanm">
//other properties
<Ontologyowl:useStudyList>
<Ontologyowl:StudyList rdf:about="stdl184516"/>
</Ontologyowl:useStudyList>
</Ontologyowl:Student>
......变得像这样:
<Ontologyowl:Student rdf:about="ehsanm">
//other properties
</Ontologyowl:Student>
<Ontologyowl:StudyList rdf:about="stdl184516"/>
因此该财产被抛弃了。我没有文字属性的这个问题。 问题2 :问题是什么?
提前感谢您的关注和帮助。
答案 0 :(得分:3)
您确实删除了该属性,但是还有其他与<stdl184516>
相关的语句没有删除。
以下是您的实际陈述(海龟格式):
<ehsanm> a Ontologyowl:Student .
## Other statements
<ehsanm> Ontologyowl:useStudyList <stdl184516> .
<stdl184516> a Ontologyowl:StudyList .
因此,删除Ontologyowl:useStudyList
主题的<ehsanm>
谓词(以及包含它的语句)将留下关于<stdl184516>
类型的剩余断言是有意义的。< / p>
您没有文字问题的原因是您没有文字作为语句的主语(它们只是语句的对象)。因此删除该语句将删除文字(以及对它的所有引用)。使用资源作为语句的对象,可能会有关于该资源的其他语句(在您的示例中就是这种情况)。
RDF认为文字是不相交的,这意味着它们都是不同的(即使它们具有相同的值)。这就是为什么将谓词删除到文字(如果你想以这种方式想到它的“链接”)也会删除文字。
更新(添加到Lame先生的回复中):从概念上讲,RDF是关于节点(资源)图中的边(关系/谓词)。删除节点的概念与RDF相反;它意味着节点(资源)本身就有意义。即使通过声明其rdf:type
来键入资源,也是节点/边/节点语句。单独的节点URI被认为是不透明的,除了作为唯一标识符之外没有语义。这就是为什么RDF不允许“裸”节点(语句之外的节点) - 它们没有固有的含义。
要扩展Ehsan提出的问题,删除节点实际上会删除所有传入/传出谓词。这并不真正“删除”节点,它实际上删除了引用它的所有语句/断言(当没有语句引用它时将其视为“隐藏”)。
答案 1 :(得分:2)
您的问题与ROWLEX无关,但这是典型的图形问题:如果删除节点,您会在多长时间内删除删除?当您使用文字删除属性时,案例很简单,因为图表没有延续。当您删除指向另一个节点的属性时,是否应删除该节点?您的示例中的删除看起来很明显,因为您的图表既不包含循环引用也不包含共享关系。
想象一下下图:你有3个人:A(亚当),B(比尔)和他们的父亲F(弗雷德)。你有A - F和B - F之间的父亲关系。 你删除了亚当和他父亲之间的关系。您应该删除父节点并将Bill带入不一致(孤立:)状态吗?这里的答案是“不”。您只删除关系。
在UML图中,您可以选择聚合关系来区分“拥有”和“共享”。它以线末端的钻石颜色(黑色或白色)表示。在关系数据库中,您可以定义或忽略外键上的“级联删除”。它们代表了相同的概念。不幸的是,RDF不会在属性上提供这些额外的元数据。如果RDF有这些信息,我们可以确定我们应该在图表上何时以及在多远程度上删除删除。但我们没有。这样就说明了坏消息:你是独立的,你可以按照自己的意愿实施删除。