Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 解析单个RDF字符串_Scala_Rdf_Jena_Openrdf - Fatal编程技术网

Scala 解析单个RDF字符串

Scala 解析单个RDF字符串,scala,rdf,jena,openrdf,Scala,Rdf,Jena,Openrdf,我有两个RDF海龟数据字符串 val a: String = "<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>" val b: String = "<http://www.test.com/meta#0002> <http://www.test.com/

我有两个RDF海龟数据字符串

val a: String = "<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>"
val b: String = "<http://www.test.com/meta#0002> <http://www.test.com/meta#CONCEPT_hasType> \"BEAR\"^^<http://www.w3.org/2001/XMLSchema#string>"
如果我还可以从每个解析的项中提取本地项,那么就有了额外的好处

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

是否有一个库(java或scala)可以为我进行此拆分?我已经看过Jena和OpenRDF,但找不到一种方法来进行这一单行分割。

多亏了@AndyS的建议,我为三元组设计了这个

val line1: String = "<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> ."

val reader: Reader = new StringReader(line1) ;
val tokenizer = TokenizerFactory.makeTokenizer(reader)
val graph: Graph = GraphFactory.createDefaultGraph()
val sink: StreamRDF = StreamRDFLib.graph(graph)
val turtle: LangTurtle = new LangTurtle(tokenizer, new ParserProfileBase(new Prologue(), null), sink)
turtle.parse()

println("item is this: " + graph)
println(graph.size())
println(graph.find(null, null, null).next())
val trip = graph.find(null, null, null).next()
val sub = trip.getSubject
val pred = trip.getPredicate
val obj = trip.getObject
println(s"subject[$sub] predicate[$pred] object[$obj]")

val subLoc = sub.getLocalName
val predLoc = pred.getLocalName
val objLoc = obj.getLocalName
println(s"subject[$subLoc] predicate[$predLoc] object[$objLoc]")

它一点也不漂亮,符合我的要求。

这些似乎与你的另一个问题非常接近。此外,它可能会关闭,因为它需要一个库……在Jena中,使用RDFDataMgr.parse(StreamRDF sink,StringReader In,Lang.NT)您需要在字符串的末尾添加一个点,使它们成为N-triples。编写一个StreamRDF实现,捕获发送给它的第一个三元组。@Paul没问题。另一个问题是关于解析一个文件,这个问题是关于单数字符串的,这就是为什么我做了一个新的one@AndyS谢谢,让我走上了正确的道路,我会发布一个简短的答案。我不知道这与我在原始问题中给你的答案有什么不同,除了你使用的是Jena,而我使用的是Sesame。@JeenBroekstra我不想加载整个文件。我一次只能看一行文件并在那里处理它。您的方法是使用filestream,我只想在其中加载一个字符串。结果表明这两种方法非常相似。因为我正在使用的项目已经在使用Jena,所以我研究了如何使用Jena实现这一点。由于网上几乎没有关于这个确切过程的文档,我希望我的回答能帮助其他人。此外,我接受了你对另一个问题的回答,因为它确实回答了我原来的问题。我只是想理解为什么我最初的答案对你没有帮助(足够)。FWIW如果唯一的区别是文件与字符串的区别:如果您用一个简单的
StringReader
替换了我代码示例中的
FileInputStream
,那么其他所有操作都将完全相同。
val line1: String = "<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> ."

val reader: Reader = new StringReader(line1) ;
val tokenizer = TokenizerFactory.makeTokenizer(reader)
val graph: Graph = GraphFactory.createDefaultGraph()
val sink: StreamRDF = StreamRDFLib.graph(graph)
val turtle: LangTurtle = new LangTurtle(tokenizer, new ParserProfileBase(new Prologue(), null), sink)
turtle.parse()

println("item is this: " + graph)
println(graph.size())
println(graph.find(null, null, null).next())
val trip = graph.find(null, null, null).next()
val sub = trip.getSubject
val pred = trip.getPredicate
val obj = trip.getObject
println(s"subject[$sub] predicate[$pred] object[$obj]")

val subLoc = sub.getLocalName
val predLoc = pred.getLocalName
val objLoc = obj.getLocalName
println(s"subject[$subLoc] predicate[$predLoc] object[$objLoc]")
  def extractRdfLineAsQuad(line: String): Option[Quad] = {
    val reader: Reader = new StringReader(line)
    val tokenizer = TokenizerFactory.makeTokenizer(reader)
    val parser: LangNQuads = new LangNQuads(tokenizer, RiotLib.profile(Lang.NQUADS, null), null)

    if (parser.hasNext) Some(parser.next())
    else None
  }