Allyson Lister wrote:
Hi Syed,

I think there are two points here:

   1. There is a bug with biomart, irrespective of how you query
      against it (soapUI, martview, Apache CXF). You've shown it in
      the previous email you sent: the response to my query contains
      multiple result rows that all share the same GO ID, even though
      the GO Name is different. For example,

This one is my fault (see the previous email). The GO ID and description are coming from different tables thanks to a mistake in the old uniprot prototype configuration so what you are seeing is the combatorial join and is very confusing I agree! Easily fixed if someone has access to that mart's config still.

   1. <resultsRow>
                <go_id xsi:type="xsd:string" modelReference="">GO
      ID(s)</go_id>
                <go_name xsi:type="xsd:string" modelReference="">GO
      Description</go_name>
             </resultsRow>
             <resultsRow>
                <go_id xsi:type="xsd:string"
      modelReference="">GO:0007049</go_id>
                <go_name xsi:type="xsd:string" modelReference="">cell
      cycle</go_name>
             </resultsRow>
             <resultsRow>
                <go_id xsi:type="xsd:string"
      modelReference="">GO:0007049</go_id>
                <go_name xsi:type="xsd:string"
      modelReference="">physiological process</go_name>
             </resultsRow>
      This simply doesn't make sense, especially as how the results
      (GO IDs) change if you don't ask to have the go_name attribute
      returned. Somewhere, there is an error in the methods being
      called. Perhaps this isn't a problem with biomart, but with
      whoever authored the uniprot mart. However, it is not a correct
      return type. Being able to access an up-to-date mart instance of
      uniprot might help resolve this issue.
   2. The soap client I'm using is NOT one I've written - it is
      autogenerated, via Apache CXF (a freely-available, widely-used
      SOAP app). Therefore *anyone* who may wish to use the Biomart
      SOAP instance you have via Apache CXF's wsdl2java feature *will*
      run into exactly the same problem. I think the problem may stem
      from the following part of martxsd:
          <xs:element name="queryResponse">
              <xs:complexType>
                  <xs:sequence>
                      <xs:element minOccurs="0"
                                  maxOccurs="unbounded"
                                  name="resultsRow"
                                  type="xs:string"/>
                  </xs:sequence>
              </xs:complexType>
          </xs:element>
      This states that the query response will always be a sequence of
      xs:string, or in Java, a List<String>. This does not allow for
      the varied types of responses one can get based on the
      attributes of the query that they've written. Therefore I think
      that the java code is trying to fit in the response (such as the
      one Syed showed and which I copied a portion of into #1 above)
      into a sequence of xs:string, and this just isn't working. I can
      create an empty maven project that builds the Java code and runs
      the unit tests if it would help - then you could download that
      project, and just run it on your own system to see what the
      problem is and possible ways of resolving it. Perhaps there is
      some way to change the queryResponse? Because, as it stands, how
      does the queryResponse element above match the actual response
      given by the soap UI?

Thanks very much! :)



2009/1/24 Syed Haider <[email protected] <mailto:[email protected]>>

    Hi Allyson,
    Just tried your query on SoapUI, works fine. The count is correct
    too, it returns 2.
    2 means  there are two gene names (cdc13 and CDC13) in UNIPROT
    PROTOTYPE mart and the number of result rows are ~60 because of GO
    IDs attributes selection which makes the result set with all the
    GO IDs against the said gene names. Unfortunately, I cant be of
    any help on your Soap client why its misbehaving, somebody from
    list please ????

    Hope this helps a bit,
    Syed


    Allyson Lister wrote:

        Hi all,

        I've tried to recreate a simple query done in biomart.org
        <http://biomart.org> <http://biomart.org>'s own MartView using
        the new SOAP services. Here is my Unit Test method where I've
        done the query:


        public class TestClass {

           MartServiceSoap client;

           @Before
           public void setUp() {
               // the JaxWsProxyFactoryBean method of getting the
        client doesn't work. While the interceptors work and are
               // clearly getting the right sort of response from the
        biomart service, the getRegistry() calls and similar
               // don't work properly.
               BioMartSoapService biomartService = new
        BioMartSoapService();
               client = biomartService.getBioMartSoapPort();

           }

           /**
            * Test the XML-equivalent query:
            * <?xml version="1.0" encoding="UTF-8"?>
            * <!DOCTYPE Query>
            * <Query  virtualSchemaName = "default" formatter = "TSV"
        header = "0" uniqueRows = "0" count = "" datasetConfigVersion
        = "0.5" >
            * <p/>
            * <Dataset name = "uniprot" interface = "default" >
            * <Filter name = "gene_name" value = "cdc13"/>
            * <Attribute name = "go_id" />
            * <Attribute name = "go_name" />
            * </Dataset>
            * </Query>
            */
           @Test
           public void GoFromUniProtTest() throws
        BioMartException_Exception {

               Filter filter = new Filter();
               filter.setName( "gene_name" );
               filter.setValue( "cdc13" );

               Attribute a1 = new Attribute();
               a1.setName( "go_id" );
               Attribute a2 = new Attribute();
               a2.setName( "go_name" );

               Dataset dataset = new Dataset();
               dataset.setName( "uniprot" );
               dataset.getFilter().add( filter );
               dataset.getAttribute().add( a1 );
               dataset.getAttribute().add( a2 );
               List<String> results =
                       client.query( "default", 0, 1, 0, new
        ArrayList<Dataset>( Arrays.asList( dataset ) ) );
               int iii = 0;
               for ( String result : results ) {
                   System.err.println( "result: " + iii++ + " " +
        result );
               }
           }
        }

        I have done this test twice, once with count set to 0 (to
        return actual results) and once with count set to 1, to see
        how many results we'd get. In the MartView, there are 50
        results. Here is the output when count == 0:

        result: 0
        result: 1
        result: 2
        result: 3
        result: 4
        result: 5
        result: 6
        result: 7
        result: 8
        result: 9
        result: 10
        result: 11
        result: 12
        result: 13
        result: 14
        result: 15
        result: 16
        result: 17
        result: 18
        result: 19
        result: 20
        result: 21
        result: 22
        result: 23
        result: 24
        result: 25
        result: 26
        result: 27
        result: 28
        result: 29
        result: 30
        result: 31
        result: 32
        result: 33
        result: 34
        result: 35
        result: 36
        result: 37
        result: 38
        result: 39
        result: 40
        result: 41
        result: 42
        result: 43
        result: 44
        result: 45
        result: 46
        result: 47
        result: 48
        result: 49
        result: 50
        result: 51
        result: 52
        result: 53
        result: 54
        result: 55
        result: 56
        result: 57
        result: 58
        result: 59
        result: 60
        result: 61
        result: 62
        result: 63
        result: 64
        result: 65
        result: 66

        As you can see, there are only empty strings in the results,
        and yet there are 66 empty strings. How am I misinterpreting
        the return value of the query? Also, why is the size of the
        results List 66, when martview returns 50?

        When I run with count == 1, I get the following result:
        result: 0 2

        This means there was only one item in the list, which
        contained the string value "2". This implies that there are
        only 2 results for this query, when martview says there are 50.

        I am confused! Martview says the query has 50 results, and
        provides those results. MartSoap says there are 66 (or 2!) but
        cannot display any of those results.

        Please let me know what I'm doing wrong!

--
        Allyson Lister
        http://lurena.vox.com

        CISBAN, http://www.cisban.ac.uk
        Newcastle University




--

Allyson Lister
http://lurena.vox.com

CISBAN, http://www.cisban.ac.uk
Newcastle University

Reply via email to