Skip to content

Commit 0642e02

Browse files
authored
Implement custom prefix mapper to ensure use of longest namespace match. (#169)
1 parent d7c91c1 commit 0642e02

2 files changed

Lines changed: 32 additions & 20 deletions

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package org.renci.relationgraph
2+
3+
case class LongestFirstPrefixMapping(prefixToNS: Map[String, String], oboPrefixes: Boolean) {
4+
5+
private val nsToPrefix = prefixToNS.toList
6+
.map { case (prefix, ns) => (ns, prefix) }
7+
.sortBy { case (ns, _) => -ns.length }
8+
private val oboNS = "http://purl.obolibrary.org/obo/"
9+
10+
def compactOpt(uri: String): Option[String] = {
11+
nsToPrefix.collectFirst { case (ns, prefix) if uri.startsWith(ns) =>
12+
val local = uri.substring(ns.length, uri.length)
13+
s"$prefix:$local"
14+
}
15+
}.orElse {
16+
if (oboPrefixes && uri.startsWith(oboNS)) {
17+
val id = uri.substring(oboNS.length, uri.length)
18+
Some(id.split("_", 2).mkString(":"))
19+
} else None
20+
}
21+
22+
def compact(uri: String): String = compactOpt(uri).getOrElse(uri)
23+
24+
}

cli/src/main/scala/org/renci/relationgraph/TSVStreamRDF.scala

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,14 @@ package org.renci.relationgraph
33
import org.apache.jena.graph.Triple
44
import org.apache.jena.riot.system.StreamRDF
55
import org.apache.jena.shared.PrefixMapping
6-
import org.apache.jena.shared.impl.PrefixMappingImpl
76
import org.apache.jena.sparql.core.Quad
87

98
import java.io.{File, PrintWriter}
109
import scala.jdk.CollectionConverters._
1110

1211
class TSVStreamRDF(file: File, prefixes: Map[String, String], oboPrefixes: Boolean) extends StreamRDF {
1312

14-
private val prefixMapping: PrefixMapping = {
15-
val pm = new PrefixMappingImpl() {
16-
override def shortForm(uri: String): String = {
17-
val shortForm = super.shortForm(uri)
18-
if (oboPrefixes && (shortForm == uri) && (uri.startsWith("http://purl.obolibrary.org/obo/"))) {
19-
val tail = uri.replace("http://purl.obolibrary.org/obo/", "")
20-
tail.split("_", 2).mkString(":")
21-
} else shortForm
22-
}
23-
}
24-
pm.setNsPrefixes(prefixes.asJava).withDefaultMappings(PrefixMapping.Standard)
25-
}
13+
private val prefixMapping = LongestFirstPrefixMapping(PrefixMapping.Standard.getNsPrefixMap.asScala.toMap ++ prefixes, oboPrefixes)
2614

2715
private var writer: PrintWriter = _
2816

@@ -31,17 +19,17 @@ class TSVStreamRDF(file: File, prefixes: Map[String, String], oboPrefixes: Boole
3119
}
3220

3321
override def triple(triple: Triple): Unit = {
34-
val s = triple.getSubject.toString(prefixMapping, true)
35-
val p = triple.getPredicate.toString(prefixMapping, true)
36-
val o = triple.getObject.toString(prefixMapping, true)
22+
val s = prefixMapping.compact(triple.getSubject.toString)
23+
val p = prefixMapping.compact(triple.getPredicate.toString)
24+
val o = prefixMapping.compact(triple.getObject.toString)
3725
writer.println(s"$s\t$p\t$o")
3826
}
3927

4028
override def quad(quad: Quad): Unit = {
41-
val s = quad.getSubject.toString(prefixMapping, true)
42-
val p = quad.getPredicate.toString(prefixMapping, true)
43-
val o = quad.getObject.toString(prefixMapping, true)
44-
val g = quad.getGraph.toString(prefixMapping, true)
29+
val s = prefixMapping.compact(quad.getSubject.toString)
30+
val p = prefixMapping.compact(quad.getPredicate.toString)
31+
val o = prefixMapping.compact(quad.getObject.toString)
32+
val g = prefixMapping.compact(quad.getGraph.toString)
4533
writer.println(s"$s\t$p\t$o\t$g")
4634
}
4735

0 commit comments

Comments
 (0)