以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Semantic Web(语义Web)/描述逻辑/本体 』  (http://bbs.xml.org.cn/list.asp?boardid=2)
----  Jena对本体内容的刪除無效   新增、修改、删除一问  (http://bbs.xml.org.cn/dispbbs.asp?boardid=2&rootid=&id=126053)


--  作者:pkmu8426
--  发布时间:2/11/2013 3:25:00 PM

--  Jena对本体内容的刪除無效   新增、修改、删除一问
这几天试了又试 实在是顶不住  因此上来求教了  恳请解惑

是这样的 我用Protege建了一本体

Java + Jena 推论   因有需求, 需要新增、删除、修改 本体中的Property, 关联

首先我推论了一InfModel  然后测试删除  并打印结果出来验证 测试是否已删除 。
打印语法大致如下 根据采用的类别不同会稍微改变。
下面的方法, 实际上我这边呼叫时只传入(model,null,Property,null)
目的是从本体中寻找关联p是否存在 若存在 则删除。
public static void deleteStatements2(Model m, Resource rs, Property p, Resource rs2)

    OntModel om =
              ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM,m);
   
    Resource subject = null;
    Property predicate = null;
    RDFNode ob  = null;
    for(StmtIterator i = om.listStatements(rs, p, rs2); i.hasNext(); )
    {
     Statement stmt = i.nextStatement();
     subject = stmt.getSubject();
     predicate = stmt.getPredicate();
     ob = stmt.getObject();  
                   if(om.contains(stmt))   
                   { System.out.println("Contain");
                   }else
                   { System.out.println("Not contain");
                   }
    }
}

测试过的删除方法如下

1.model.remove(statement)
2.model.remove(Subject, Property, RDFNode)
3.
Resource r = om.getResource(property.toString());
OntResource orr = om.getOntResource(r);
orr.remove();
4. om.getBaseModel.remove(statement) or
   om.getBaseModel.remove (Subject, Property, RDFNode)

大多数能想到的都尽量试了  但打印出的结果却总是没有删除。
仿佛对我下的语法豪无反应。
网上爬了几天的资料, 目前心得是  本体再Jena规范下  似乎最原始的结构是不可修改的
而无论对本体进行新增、删除等  都是针对本体所对应的BaseModel去做, 不知是否如此?
否则怎么我用了一大串remove语法 打印出的结果却总是没有删除。
我也初步测试了.getBaseModel 去删除  但不晓得是弄错步骤  还是什么原因,
总而言之是失败的。
能否有实际代码?  实在是不晓得为何无法对本体内的内容进行删除。

如有需要 我可以将完整代码贴上... 但因为写得很乱
因此需要再整理一下。
谢谢。


--  作者:pkmu8426
--  发布时间:2/12/2013 7:12:00 PM

--  
基于不轻言放弃的精神...
目前暂时找到个解  虽然不确定一般而言是否照此运作
但好歹初步测试可以了。
原因似乎在于InfModel身上  推论过后的InfModel似乎不允许随意删除。

题外话:若是仅建立一个Model, 从owl档读入后 删除是成功的。
网上看到了一篇文 提到下面这个东西  虽然并无正相关  试了一下却正好解了困扰我几天的问题。
Model m =  inm.getDeductionsModel();
m.remove(Statement);
if(m.contains(Statement)) ...
字面上很简单可以理解  推论过后, 取得推论的model, 删除、验证
即可正确取得结果。
剩下新增、修改的部份..还有待测试, 如有成果 我想我会将心得打在这篇。
不过最疑惑的是...为何Jena搞得如此复杂..一个model不够, 还要衍伸一堆model,
又无法任意说动就动。 正确、详细的使用规范也不太多...真有点伤时伤脑。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
2,949.219ms