我有几行(我认为)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 RDF4J的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
代替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开发团队中)