in OpenCalaisAnnotatorGroovy/src/main/groovy/org/apache/uima/annotator/calais_groovy/RdfProcessor.groovy [45:107]
def processRdf(rdfTextInstance, jcas) {
// 4 passes
// pass 1 - create url to node map
// pass 2 - create entities
// pass 3 - create relations (point to entities)
// pass 4 - create instances of entities and relations -
// ref entities and relations, and have begin/end refs to text
// pass 2, 3, and 4 blended and done in 1 iteration.
def rdf = new XmlSlurper().parseText(rdfTextInstance.rdfText)
// pass 1
descriptionMap = [ : ]
rdf.Description.each {descriptionMap.put(it.@about.toString(), it)}
if (debugPrint >= 3) {
descriptionMap.each {k, v -> println "key = $k, value=$v"}
}
// pass 2, 3 and 4 blended
entityMap = [ : ] // key = url for entity, value = featureStructure for it
instances = []
relationMap = [ : ]
rdf.Description.each {
def typeurl = it.type[0].@resource
if (isEntity(typeurl)) {
getOrMakeEntity(it.@about.toString(), jcas)
} else if (isRelation(typeurl)) {
getOrMakeRelation(it.@about.toString(), jcas)
} else if (isInstance(typeurl)) {
def entityOrRelation = descriptionMap.get(it.subject[0].@resource.toString())
def is_entity = isEntity(entityOrRelation.type[0].@resource)
def kind = is_entity ? 'Entity' : 'Relation'
def instance = newJCasInstance(jcas, "${kind}Instance")
instances.add(instance)
if (is_entity) {
instance.entity = getOrMakeEntity(entityOrRelation.@about.toString(), jcas)
} else {
instance.relation = getOrMakeRelation(entityOrRelation.@about.toString(), jcas)
}
instance.begin = Integer.valueOf(it.offset[0].text())
instance.end = Integer.valueOf(it.offset[0].text()) + Integer.valueOf(it.length[0].text())
instance.addToIndexes()
}
}
if (debugPrint >= 2) {
entityMap.each{k, v -> println "entity key = $k, value=$v"} // test-debug
}
if (debugPrint >= 2) {
relationMap.each {k, v -> println "relation: k: $k, v: $v"} // debug test
}
if (debugPrint >= 1) {
instances.each {println "instance $it"}
}
descriptionMap = entityMap = relationMap = instances = null
}