[kepler-dev] ontology with imported ontologies bug
Chris Weed
chrisweed at gmail.com
Fri Jul 9 11:52:34 PDT 2010
Kepler 2.0 does not seem to correctly deal with ontologies that import
concepts from other ontologies.
I was looking through my changes to NamedOntModel from Kepler 1.X Dev,
and it looks like I added a method called
getNameSpaces() that returns a list of the namespaces from all ontologies
public List<String> getNameSpaces() {
List<String> result = new ArrayList<String>();
for(Iterator<Ontology> iter = _ontModel.listOntologies();iter.hasNext();)
{
result.add(iter.next().getNameSpace());
}
return result;
}
Then I changed OntologyCatalog's methods getNamedOntClass:
public NamedOntClass getNamedOntClass(SemanticType st) {
String conceptId = st.getConceptId();
String[] parts = conceptId.split("#");
// make sure we have a valid semantic type
if (parts.length != 2) {
return null;
}
// search for a matching model and class
for (Iterator iter = getNamedOntModels(); iter.hasNext();) {
NamedOntModel m = (NamedOntModel) iter.next();
//if (m.getNameSpace().equals(parts[0])) {
//if (m.getNameSpaces().contains(parts[0])) {
if (startsWith(m.getNameSpaces(),parts[0])) {
for (Iterator iter2 = m.getNamedClasses(false); iter2.hasNext();) {
NamedOntClass c = (NamedOntClass) iter2.next();
if (c.getLocalName().equals(parts[1])) {
return c;
}
}
}
}
return null;
}
boolean startsWith(List<String> l,String s)
{
for(Iterator<String> iter = l.iterator();iter.hasNext();)
if(s.startsWith(iter.next()))
return true;
return false;
}
public NamedOntClass getNamedOntClass(String namespace, String localName) {
if (namespace == null || localName == null) {
return null;
}
// search for a matching model and class
for (Iterator iter = getNamedOntModels(); iter.hasNext();) {
NamedOntModel m = (NamedOntModel) iter.next();
String m_nspace = m.getNameSpace() + "#";
//if (m.getNameSpace().equals(namespace)
// || m_nspace.equals(namespace)) {
if (m.getNameSpaces().contains(namespace)
|| m_nspace.equals(namespace)) {
for (Iterator<NamedOntClass> iter2 = m.getNamedClasses(false); iter2
.hasNext();) {
NamedOntClass c = (NamedOntClass) iter2.next();
if (c.getLocalName().equals(localName)) {
return c;
}
}
}
}
return null;
}
I am not sure if this is a solution you want to use.
FYI
Chris
More information about the Kepler-dev
mailing list