【问题标题】:How can I modify or remove properties values? - Jena API如何修改或删除属性值? - 耶拿 API
【发布时间】:2011-08-14 11:45:47
【问题描述】:

我正在使用耶拿。我想知道是否有一种方法可以修改或删除实例的属性值?

谢谢

【问题讨论】:

    标签: java awt rdf jena owl


    【解决方案1】:

    Jena 中的语句在设计上是不可变的。要更改某个主题s 的属性p 的值,您需要添加一个主谓相同的新语句,并删除旧语句。这在耶拿总是如此,即使 API 有时会向您隐藏这一点。例如,OntResource 及其子类有多种 setProperty 变体,但在底层它们执行相同的添加新三重和删除旧过程。

    【讨论】:

      【解决方案2】:

      这取决于您使用的 Jena API。例如,如果您使用 Jena 3.0 和 Model API,您可以使用 Model.remove(Statement) 通过为语句选择适当的主题/谓词/对象来删除属性。可以通过删除旧版本的 Statement 并添加新版本来实现修改。

      【讨论】:

      • 我得到了java.util.ConcurrentModificationException,我使用jena 3.1
      • 发布一个新问题,并包含所有相关详细信息,包括完整的堆栈跟踪、Jena 版本以及应用程序中的相关代码。
      【解决方案3】:

      要仅删除语句本身,即实例和属性值之间的关系,您可以使用: OntResource.removeProperty(Property, RDFNode)

      如果您想完全删除属性值,即值及其所有关系,您可以使用:OntResource.remove()

      【讨论】:

        【解决方案4】:

        我有类似的任务:我需要删除具有指定值的属性。希望以下代码 sn-p 对某人有所帮助。

          public void removeLabel(String language, String value) {
                NodeIterator nodeIterator = resource.getModel().listObjectsOfProperty(RDFS.label);
                RDFNode foundToDelete = null;
                while (nodeIterator.hasNext()) {
                    RDFNode next = nodeIterator.next();
                    boolean langsAreIdentical = next.asLiteral().getLanguage().equals(language);
                    boolean valuesAreIdentical = next.asLiteral().getLexicalForm().equals(value);
                    if (langsAreIdentical && valuesAreIdentical) {
                        foundToDelete = next;
                        break;
                    }
                }
                resource.getModel().remove(resource, RDFS.label, foundToDelete);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多