Skip to content

Commit

Permalink
Added read and write of IBond and .order
Browse files Browse the repository at this point in the history
  • Loading branch information
egonw committed Oct 17, 2010
1 parent 2e4a731 commit fe2d8a4
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 2 deletions.
8 changes: 8 additions & 0 deletions src/main/org/openscience/cdk/libio/jena/CDK.java
Expand Up @@ -40,8 +40,16 @@ private static final Property property(String local) {

public static final Resource Molecule = resource("Molecule");
public static final Resource Atom = resource("Atom");
public static final Resource Bond = resource("Bond");
public static final Resource SingleBond = resource("SingleBond");
public static final Resource DoubleBond = resource("DoubleBond");
public static final Resource TripleBond = resource("TripleBond");
public static final Resource QuadrupleBond = resource("QuadrupleBond");

public static final Property hasAtom = property("hasAtom");
public static final Property hasBond = property("hasBond");
public static final Property bindsAtom = property("bindsAtom");
public static final Property hasOrder = property("hasOrder");
public static final Property symbol = property("symbol");

}
55 changes: 53 additions & 2 deletions src/main/org/openscience/cdk/libio/jena/Convertor.java
Expand Up @@ -22,7 +22,11 @@
*/
package org.openscience.cdk.libio.jena;

import java.util.HashMap;
import java.util.Map;

import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IChemObject;
import org.openscience.cdk.interfaces.IChemObjectBuilder;
import org.openscience.cdk.interfaces.IMolecule;
Expand Down Expand Up @@ -55,16 +59,35 @@ public static Model molecule2Model(IMolecule molecule) {
createIdentifier(model, molecule)
);
model.add(subject, RDF.type, CDK.Molecule);
int atomCounter = 0;
Map<IAtom,Resource> cdkToRDFAtomMap = new HashMap<IAtom, Resource>();
for (IAtom atom : molecule.atoms()) {
atomCounter++;
Resource rdfAtom = model.createResource(
createIdentifier(model, atom)
);
cdkToRDFAtomMap.put(atom, rdfAtom);
model.add(rdfAtom, RDF.type, CDK.Atom);
model.add(rdfAtom, CDK.symbol, atom.getSymbol());
model.add(subject, CDK.hasAtom, rdfAtom);
}
for (IBond bond : molecule.bonds()) {
Resource rdfBond = model.createResource(
createIdentifier(model, bond)
);
model.add(rdfBond, RDF.type, CDK.Bond);
for (IAtom atom : bond.atoms()) {
model.add(rdfBond, CDK.bindsAtom, cdkToRDFAtomMap.get(atom));
}
if (bond.getOrder() == IBond.Order.SINGLE) {
model.add(rdfBond, CDK.hasOrder, CDK.SingleBond);
} else if (bond.getOrder() == IBond.Order.DOUBLE) {
model.add(rdfBond, CDK.hasOrder, CDK.DoubleBond);
} else if (bond.getOrder() == IBond.Order.TRIPLE) {
model.add(rdfBond, CDK.hasOrder, CDK.TripleBond);
} else if (bond.getOrder() == IBond.Order.QUADRUPLE) {
model.add(rdfBond, CDK.hasOrder, CDK.QuadrupleBond);
}
model.add(subject, CDK.hasBond, rdfBond);
}
return model;
}

Expand All @@ -85,14 +108,42 @@ public static IMolecule model2Molecule(Model model,
if (mols.hasNext()) {
Resource rdfMol = mols.next();
mol = builder.newMolecule();
Map<Resource,IAtom> rdfToCDKAtomMap = new HashMap<Resource,IAtom>();
StmtIterator atoms = rdfMol.listProperties(CDK.hasAtom);
while (atoms.hasNext()) {
Statement rdfAtom = atoms.nextStatement();
IAtom atom = builder.newAtom();
rdfToCDKAtomMap.put(rdfAtom.getSubject(), atom);
Statement symbol = rdfAtom.getProperty(CDK.symbol);
if (symbol != null) atom.setSymbol(symbol.getString());
mol.addAtom(atom);
}
StmtIterator bonds = rdfMol.listProperties(CDK.hasBond);
while (bonds.hasNext()) {
Statement rdfBond = bonds.nextStatement();
IBond bond = builder.newBond();
StmtIterator bondAtoms = rdfBond.getResource()
.listProperties(CDK.bindsAtom);
int atomCounter = 0;
while (bondAtoms.hasNext()) {
Statement rdfAtom = bondAtoms.nextStatement();
IAtom atom = rdfToCDKAtomMap.get(rdfAtom.getResource());
bond.setAtom(atom, atomCounter);
atomCounter++;
}
Resource order = rdfBond.
getProperty(CDK.hasOrder).getResource();
if (order.equals(CDK.SingleBond)) {
bond.setOrder(IBond.Order.SINGLE);
} else if (order.equals(CDK.DoubleBond)) {
bond.setOrder(IBond.Order.DOUBLE);
} else if (order.equals(CDK.TripleBond)) {
bond.setOrder(IBond.Order.TRIPLE);
} else if (order.equals(CDK.QuadrupleBond)) {
bond.setOrder(IBond.Order.QUADRUPLE);
}
mol.addBond(bond);
}
}
return mol;
}
Expand Down
4 changes: 4 additions & 0 deletions src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java
Expand Up @@ -28,6 +28,7 @@

import org.junit.BeforeClass;
import org.junit.Test;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.io.ChemObjectWriterTest;
import org.openscience.cdk.nonotify.NNAtom;
Expand All @@ -50,8 +51,11 @@ public class CDKOWLWriterTest extends ChemObjectWriterTest {

IMolecule mol = new NNMolecule();
mol.addAtom(new NNAtom("C"));
mol.addAtom(new NNAtom("C"));
mol.addBond(0,1,IBond.Order.DOUBLE);
writer.write(mol);
String outputString = output.toString();
System.out.println(outputString);
Assert.assertTrue(outputString.contains(
"http://cdk.sourceforge.net/model.owl#"
));
Expand Down
12 changes: 12 additions & 0 deletions src/test/org/openscience/cdk/libio/jena/ConvertorTest.java
Expand Up @@ -26,6 +26,7 @@

import org.junit.Test;
import org.openscience.cdk.CDKTestCase;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IChemObjectBuilder;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.nonotify.NNAtom;
Expand Down Expand Up @@ -60,4 +61,15 @@ public class ConvertorTest extends CDKTestCase {
Assert.assertEquals("Unexpected diff: " + diff, 0, diff.length());
}

@Test public void roundtripBond() {
IMolecule mol = new NNMolecule();
mol.addAtom(new NNAtom("C"));
mol.addAtom(new NNAtom("C"));
mol.addBond(0,1,IBond.Order.DOUBLE);
Model model = Convertor.molecule2Model(mol);
IMolecule rtMol = Convertor.model2Molecule(model, builder);
String diff = AtomContainerDiff.diff(mol, rtMol);
Assert.assertEquals("Unexpected diff: " + diff, 0, diff.length());
}

}

0 comments on commit fe2d8a4

Please sign in to comment.