diff --git a/src/main/org/openscience/cdk/libio/jena/CDK.java b/src/main/org/openscience/cdk/libio/jena/CDK.java index 7dbefbe97d9..b6633b10955 100644 --- a/src/main/org/openscience/cdk/libio/jena/CDK.java +++ b/src/main/org/openscience/cdk/libio/jena/CDK.java @@ -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"); } \ No newline at end of file diff --git a/src/main/org/openscience/cdk/libio/jena/Convertor.java b/src/main/org/openscience/cdk/libio/jena/Convertor.java index a636774f6ce..3d3f74741e2 100644 --- a/src/main/org/openscience/cdk/libio/jena/Convertor.java +++ b/src/main/org/openscience/cdk/libio/jena/Convertor.java @@ -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; @@ -55,16 +59,35 @@ public static Model molecule2Model(IMolecule molecule) { createIdentifier(model, molecule) ); model.add(subject, RDF.type, CDK.Molecule); - int atomCounter = 0; + Map cdkToRDFAtomMap = new HashMap(); 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; } @@ -85,14 +108,42 @@ public static IMolecule model2Molecule(Model model, if (mols.hasNext()) { Resource rdfMol = mols.next(); mol = builder.newMolecule(); + Map rdfToCDKAtomMap = new HashMap(); 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; } diff --git a/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java b/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java index 81deeb43318..70acdeb8c37 100644 --- a/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java +++ b/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java @@ -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; @@ -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#" )); diff --git a/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java b/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java index 1d41a884c1f..c047f1c7073 100644 --- a/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java +++ b/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java @@ -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; @@ -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()); + } + }