From d0c2b50f4641043e6aeca622448ddec50bcabe94 Mon Sep 17 00:00:00 2001 From: Egon Willighagen Date: Tue, 6 Oct 2009 15:35:07 +0200 Subject: [PATCH] Added read/write of IAtom.symbol in RDF --- .../openscience/cdk/libio/jena/Convertor.java | 45 ++++++++++++++++--- .../cdk/io/rdf/CDKOWLWriterTest.java | 2 + .../cdk/libio/jena/ConvertorTest.java | 10 +++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/main/org/openscience/cdk/libio/jena/Convertor.java b/src/main/org/openscience/cdk/libio/jena/Convertor.java index 1a73a4d49eb..9f4d51cc8fb 100644 --- a/src/main/org/openscience/cdk/libio/jena/Convertor.java +++ b/src/main/org/openscience/cdk/libio/jena/Convertor.java @@ -22,12 +22,17 @@ */ package org.openscience.cdk.libio.jena; +import org.openscience.cdk.interfaces.IAtom; import org.openscience.cdk.interfaces.IChemObjectBuilder; import org.openscience.cdk.interfaces.IMolecule; import com.hp.hpl.jena.rdf.model.Model; import com.hp.hpl.jena.rdf.model.ModelFactory; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; import com.hp.hpl.jena.vocabulary.RDF; /** @@ -42,22 +47,48 @@ public class Convertor { public static Model molecule2Model(IMolecule molecule) { - Model model = ModelFactory.createOntologyModel(); - model.setNsPrefix("cdk", "http://cdk.sourceforge.net/model.owl#"); + Model model = createCDKModel(); Resource subject = model.createResource( "http://cdk.sf.net/model/molecule/" + 1 ); - model.add( - subject, RDF.type, - model.createResource("cdk:Molecule") - ); + model.add(subject, RDF.type, CDK.Molecule); + int atomCounter = 0; + for (IAtom atom : molecule.atoms()) { + atomCounter++; + Resource rdfAtom = model.createResource( + "http://cdk.sf.net/model/atom/" + atomCounter + ); + model.add(rdfAtom, RDF.type, CDK.Atom); + model.add(rdfAtom, CDK.symbol, atom.getSymbol()); + model.add(subject, CDK.hasAtom, rdfAtom); + } return model; } public static IMolecule model2Molecule(Model model, IChemObjectBuilder builder) { - IMolecule mol = builder.newMolecule(); + ResIterator mols = + model.listSubjectsWithProperty(RDF.type, CDK.Molecule); + IMolecule mol = null; + if (mols.hasNext()) { + Resource rdfMol = mols.next(); + mol = builder.newMolecule(); + StmtIterator atoms = rdfMol.listProperties(CDK.hasAtom); + while (atoms.hasNext()) { + Statement rdfAtom = atoms.nextStatement(); + IAtom atom = builder.newAtom(); + Statement symbol = rdfAtom.getProperty(CDK.symbol); + if (symbol != null) atom.setSymbol(symbol.getString()); + mol.addAtom(atom); + } + } return mol; } + private static Model createCDKModel() { + Model model = ModelFactory.createOntologyModel(); + model.setNsPrefix("cdk", "http://cdk.sourceforge.net/model.owl#"); + return model; + } + } diff --git a/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java b/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java index e8e91416d14..81deeb43318 100644 --- a/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java +++ b/src/test/org/openscience/cdk/io/rdf/CDKOWLWriterTest.java @@ -30,6 +30,7 @@ import org.junit.Test; import org.openscience.cdk.interfaces.IMolecule; import org.openscience.cdk.io.ChemObjectWriterTest; +import org.openscience.cdk.nonotify.NNAtom; import org.openscience.cdk.nonotify.NNMolecule; /** @@ -48,6 +49,7 @@ public class CDKOWLWriterTest extends ChemObjectWriterTest { CDKOWLWriter writer = new CDKOWLWriter(output); IMolecule mol = new NNMolecule(); + mol.addAtom(new NNAtom("C")); writer.write(mol); String outputString = output.toString(); Assert.assertTrue(outputString.contains( diff --git a/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java b/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java index 3233ac1d138..1d41a884c1f 100644 --- a/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java +++ b/src/test/org/openscience/cdk/libio/jena/ConvertorTest.java @@ -28,6 +28,7 @@ import org.openscience.cdk.CDKTestCase; import org.openscience.cdk.interfaces.IChemObjectBuilder; import org.openscience.cdk.interfaces.IMolecule; +import org.openscience.cdk.nonotify.NNAtom; import org.openscience.cdk.nonotify.NNMolecule; import org.openscience.cdk.nonotify.NoNotificationChemObjectBuilder; import org.openscience.cdk.tools.diff.AtomContainerDiff; @@ -50,4 +51,13 @@ public class ConvertorTest extends CDKTestCase { Assert.assertEquals(0, diff.length()); } + @Test public void roundtripAtom() { + IMolecule mol = new NNMolecule(); + mol.addAtom(new NNAtom("C")); + 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()); + } + }