我有几行(我认为)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和假设?

最佳答案

大多数RDF库都会对此有所帮助。例如,如果使用Eclipse RDF4JRio 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代替InputStream

 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);


另外,如果您根本不想解析数据,而只想进行String处理,则有一个org.eclipse.rdf4j.model,URIUtil类,您可以只提供一个字符串,它可以为您返回本地名称部分的索引:

  String uri = "http://www.test.com/meta#0001";
  String localpart = uri.substring(URIUtil.getLocalNameIndex(uri));  // will be "0001"


(公开:我在RDF4J开发团队中)

10-08 06:36