java - 如何使用 RDFBeans 和 Apache Jena 反序列化 Java 对象

标签 java rdf jena

问题/问题

我可以轻松地反序列化具有简单属性(例如 String 类型)的对象。但是,当存在指向另一种类型的链接时,它不会自动解析,并且出现异常。看来链接未解析,而是作为简单的 URI 属性进行处理。

如何自动反序列化整个对象图?

更新 1

从调试中我知道,通过查询三重存储中的某个谓词来解析元素,因此在读取文件之前手动添加这些行时,SubGeographicalRegion可以被解码为 JavaBean。

  Class<SubGeographicalRegion> class1 = SubGeographicalRegion.class;
  URI class1RdfType = RDFBeanInfo.get(class1).getRDFType();
  PlainLiteral class1Literal = model.createPlainLiteral(class1.getName());
  model.addStatement(class1RdfType, RDFBeanManager.BINDINGCLASS_PROPERTY, class1Literal);

但是,即使仅引用一个且相同的 SubGeographicalRegion,似乎还是创建了一个新对象。

更新2

实现hashCode()equals()基于元素的ID解决了多实例的问题!

代码

RDF/XML 文件(摘录):

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cim="http://iec.ch/TC57/2010/CIM-schema-cim15#">
 <cim:SubGeographicalRegion rdf:ID="_93ed4cbc90fe424caa7f572e9652997">
  <cim:IdentifiedObject.name>SubRegion</cim:IdentifiedObject.name>
  <cim:SubGeographicalRegion.Region rdf:resource="#_a56f739020054bcd826f675918ab2df"/>
 </cim:SubGeographicalRegion>
 <cim:Substation rdf:ID="_da9f289336dd46bdac22c961b7b525f3">
  <cim:IdentifiedObject.name>73109E0009</cim:IdentifiedObject.name>
  <cim:Substation.Region rdf:resource="#_93ed4cbc90fe424caa7f572e9652997"/>
 </cim:Substation>
 <cim:Substation rdf:ID="_e66d0514110841c285b7956c98e52b32">
  <cim:IdentifiedObject.name>73019J0003</cim:IdentifiedObject.name>
  <cim:Substation.Region rdf:resource="#_93ed4cbc90fe424caa7f572e9652997"/>
 </cim:Substation>
</rdf:RDF>

变电站.java:

@RDFBean("http://iec.ch/TC57/2010/CIM-schema-cim15#Substation")
public class Substation {

  private String id;
  private String name;
  private SubGeographicalRegion subRegion;

  @RDFSubject
  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  @RDF("http://iec.ch/TC57/2010/CIM-schema-cim15#IdentifiedObject.name")
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @RDF("http://iec.ch/TC57/2010/CIM-schema-cim15#Substation.Region")
  public SubGeographicalRegion getSubRegion() {
    return subRegion;
  }

  public void setSubRegion(SubGeographicalRegion subRegion) {
    this.subRegion = subRegion;
  }
}

子地理区域.java:

@RDFBean("http://iec.ch/TC57/2010/CIM-schema-cim15#SubGeographicalRegion")
public class SubGeographicalRegion {

  private String id;
  private String name;

  private Collection<Substation> substations;

  @RDF("http://iec.ch/TC57/2010/CIM-schema-cim15#IdentifiedObject.name")
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @RDFSubject(prefix = "http://www.w3.org/1999/02/22-rdf-syntax-ns#ID")
  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  // this works, but returns a HashSet<URI>
  @RDF(inverseOf = "http://iec.ch/TC57/2010/CIM-schema-cim15#Substation.Region")
  public Collection<Substation> getSubstations() {
    return substations;
  }

  public void setSubstations(Collection<Substation> substations) {
    this.substations = substations;
  }
}

提示:方法SubGeographicalRegion.getSubstations()返回 HashSet<URI> (尽管它被声明为 Collection<Substation> )

这是我启动引擎的方法:

org.ontoware.rdf2go.model.Model model = RDF2Go.getModelFactory().createModel();
model.open();

// try-catch omitted for readability
model.readFrom(getClass().getResourceAsStream(RDF_XML_INPUT_FILENAME), Syntax.RdfXml);

RDFBeanManager rdfBeanManager = new RDFBeanManager(model);
ClosableIterator<Substation> substationIterator = rdfBeanManager.getAll(Substation.class);
while (substationIterator.hasNext()) {
  logger.info("substation.name: ", substationIterator.next().getName());
}

model.close();

最佳答案

您可以考虑使用 JenaSesame直接代替 RDF2Go,后者似乎不再维护。

如果您不介意使用(部分)Sesame API,您可以尝试Pinto .

关于java - 如何使用 RDFBeans 和 Apache Jena 反序列化 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347347/

相关文章:

rdf - 如何使用 SPARQL 获取 OWL 类的数据和对象属性?

java - 通过 servlet 访问资源(CSS、HTML、图像、JS)

java - Java中如何使用不同的ClassLoader重新加载已加载的类?

Java:使用正则表达式从 block 注释中去除斜杠和星号

java - 泛型方法中类类型参数的使用

php - ARC2(PHP 语义网库)错误地将 UTF-8 文件双重转换为 UTF-8

java - 从 DBpedia 资源中获取 Sesame 2.7.1 的数据类型错误

java - 如何使 Java-rdfa api 与 Jena Api 一起工作?

java - Jena model.write 获取 InvalidPropertyURIException

rdf - 本体验证的耶拿规则