我想解析一个 n-triple 形式的 RDF 文件。
我可以编写自己的解析器,但我更愿意使用库,而 Jena 似乎为此目的不必要地复杂(或者至少我看不到他们的文档解释如何以合理的方式读取 n-triples)。
您能否向我指出任何有用的库,或者如果您对 Sesame 或 Jena 非常了解,您可能对他们如何解决这个问题有所了解。
使用 Jena 并没有那么困难:
给定一个包含以下 N-TRIPLE 形式的 RDF 的文件rdfexample.ntriple
(示例取自此处):
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#year> "1988" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#price> "9.90" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#company> "CBS Records" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#country> "UK" .
<http://www.recshop.fake/cd/Hide your heart> <http://www.recshop.fake/cd#artist> "Bonnie Tyler" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#year> "1985" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#price> "10.90" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#company> "Columbia" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#country> "USA" .
<http://www.recshop.fake/cd/Empire Burlesque> <http://www.recshop.fake/cd#artist> "Bob Dylan" .
以下代码
public static void main(String[] args) {
String fileNameOrUri = "src/a/rdfexample.ntriple";
Model model = ModelFactory.createDefaultModel();
InputStream is = FileManager.get().open(fileNameOrUri);
if (is != null) {
model.read(is, null, "N-TRIPLE");
model.write(System.out, "TURTLE");
} else {
System.err.println("cannot read " + fileNameOrUri);;
}
}
读取文件,并以 TURTLE 形式打印出来:
<http://www.recshop.fake/cd/Hide your heart>
<http://www.recshop.fake/cd#artist>
"Bonnie Tyler" ;
<http://www.recshop.fake/cd#company>
"CBS Records" ;
<http://www.recshop.fake/cd#country>
"UK" ;
<http://www.recshop.fake/cd#price>
"9.90" ;
<http://www.recshop.fake/cd#year>
"1988" .
<http://www.recshop.fake/cd/Empire Burlesque>
<http://www.recshop.fake/cd#artist>
"Bob Dylan" ;
<http://www.recshop.fake/cd#company>
"Columbia" ;
<http://www.recshop.fake/cd#country>
"USA" ;
<http://www.recshop.fake/cd#price>
"10.90" ;
<http://www.recshop.fake/cd#year>
"1985" .
因此,使用 Jena,您可以轻松地将 RDF(以任何形式)解析为com.hp.hpl.jena.rdf.model.Model
对象,从而允许您以编程方式对其进行操作。
如果您只想解析 NTriples 并且除了基本处理和查询之外不需要做任何事情,那么您可以尝试NxParser。这是一段非常简单的 Java 代码,它将传递任何类似格式的 NTriples(如 NQuads 等),从而为您提供文件中语句的迭代器。如果您只想要 NTriples,您可以轻松忽略少于/多于 3 个项目的语句。
修改链接页面上的示例将给出以下简单代码:
NxParser nxp = new NxParser(new FileInputStream("filetoparse.nq"),false);
while (nxp.hasNext())
{
Node[] ns = nxp.next();
if (ns.length == 3)
{
//Only Process Triples
//Replace the print statements with whatever you want
for (Node n: ns)
{
System.out.print(n.toN3());
System.out.print(" ");
}
System.out.println(".");
}
}
老问题,但由于您明确询问不同的库,我想我会展示如何使用Eclipse RDF4J的Rio 解析器进行简单的 RDF 解析(披露:我是 RDF4J 开发人员之一)。
例如,要解析文件并将所有三元组放在 a 中Model
,只需执行以下操作:
FileInputStream in = new FileInputStream("/path/to/file.nt");
Model m = Rio.parse(in, RDFFormat.NTRIPLES);
如果您想立即将解析器输出打印到标准输出(例如以 Turtle 格式),请执行以下操作:
FileInputStream in = new FileInputStream("/path/to/file.nt");
RDFParser parser = Rio.createParser(RDFFormat.NTRIPLES);
parser.parse(in, "", Rio.createWriter(RDFFormat.TURTLE, System.out));
当然,还有更多方法可以使用这些基本工具,请查看工具包文档了解详细信息。
顺便说一下,Rio 解析器作为单独的 maven 工件提供,因此如果您希望仅使用解析器,而不使用其他 RDF4J 工具,您可以这样做。