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