Разобрать одну строку RDF

У меня есть две строки данных RDF Turtle

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>"

В каждой строке 3 предмета. Я хочу запустить одну строку через RDF-анализ и получить:

val items : Array[String] = magicallyParse(a)
items(0) == "http://www.test.com/meta#0001"

Бонус, если я могу также извлечь Локальные элементы из каждого проанализированного элемента

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

Есть ли какая-нибудь библиотека (java или scala), которая сделала бы этот раздел для меня? Я посмотрел на Jena и OpenRDF, но не смог найти способ разделить эту строку.

1 ответ

Благодаря предложению @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]")

а затем для четырехугольников я ссылался на этот код, чтобы получить это

  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
  }

Далеко не красивая, она делает то, что мне нужно.

Другие вопросы по тегам