解析RDF项目

时间:2014-12-10 18:56:45

标签: java scala rdf

我有几行(我认为)RDF数据

<http://www.test.com/meta#0001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class> 
<http://www.test.com/meta#0002> <http://www.test.com/meta#CONCEPT_hasType> "BEAR"^^<http://www.w3.org/2001/XMLSchema#string>

每行有3个项目。我想在URL之前和之后提取项目。这样会导致:

0001, type, Class
0002, CONCEPT_hasType, (BEAR, string)

那里有一个库(java或scala)可以为我分割吗?或者我只需要在代码中推送string.splits和假设?

1 个答案:

答案 0 :(得分:4)

大多数RDF库都有一些方便。例如,如果您使用Eclipse RDF4J&#39; Rio parser解析RDF数据,则会将每行替换为org.eclipse.rdf4j.model.Statement,其中包含主题,谓词和对象值。你的两行中的主题都是org.eclipse.rdf4j.model.IRI,它有一个getLocalName()方法,可以用来获取最后一个#后面的部分。有关详细信息,请参阅Javadocs

假设您的数据采用N-Triples语法(似乎是您向我们展示的示例),这里有一段简单的代码可以将其打印到STDOUT:

  // parse the file into a Model object
  InputStream in = new FileInputStream(new File("/path/to/rdf-data.nt"));
  org.eclipse.rdf4j.model.Model model = Rio.parse(in, RDFFormat.NTRIPLES);

  for (org.eclipse.rdf4j.model.Statement st: model) {
       org.eclipse.rdf4j.model.Resource subject = st.getSubject();
       if (subject instanceof org.eclipse.rdf4j.model.IRI) {
              System.out.print(((IRI)subject).getLocalName());
       }
       else {
              System.out.print(subject.stringValue());
       }
       // ... etc for predicate and object (the 2nd and 3rd elements in each RDF statement)
  }

更新如果您不想从文件中读取数据而只是使用String,则可以使用java.io.StringReader代替{{} 1}}:

InputStream

或者,如果您根本不想解析数据并且只想进行字符串处理,那么可以使用org.eclipse.rdf4j.model,URIUtil类来提供字符串,它可以让您返回本地名称部分的索引:

 StringReader r = new StringReader("<http://www.test.com/meta#0001> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://www.w3.org/2002/07/owl#Class> .");
 org.eclipse.rdf4j.model.Model model = Rio.parse(r, RDFFormat.NTRIPLES);

(披露:我在RDF4J开发团队)

相关问题