Download API: support many predicates?

Hi! A rgbif user is asking me about a particular download query, see https://github.com/ropensci/rgbif/issues/245 TLDR: AFAICT this can't work as the API is set up right now. Or am I wrong? That is, he wants to get data for records that match - 10 taxa with their taxonKey value - 3 different basisofrecord values - country = US - hasCoordinate = TRUE - hasGeospatialIssue = FALSE - year range between 1949 and 2011 - month range between 3 and 8 For the taxonKey values, I think he needs to combine those with *OR* operator: "predicate": { "type": "or", "predicates": [ { "type": "equals", "key": "TAXON_KEY", "value": "2475470" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475470" } ] } However, he should combine the other parameters (basisofrecord, hasCoordinate, year, month, etc) using *AND* AFAICT. *BUT*, AFAICT the API only allows one *predicate* key so you can't do what I think is needed here. That is, to say (taxonkey = 1 OR 2 OR 3) + (country = US AND hasCoordinate = true, etc.) I tried sending two *predicate* keys in the API and only the second goes through. Any guidance much appreciated :) The best solution I can think of is to do the query he's doing, but do one for each taxon. Seem like a good solution? Best, Scott

Hi Scott, if I understand you correctly you should be able to request a download with a filter like this one that uses a primary AND nested with some ORs: "predicate": { "type": "and", "predicates": [ { "type": "or", "predicates": [ { "type": "equals", "key": "TAXON_KEY", "value": "2475470" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475471" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475472" } ] }, { "type": "or", "predicates": [ { "type": "equals", "key": "BASIS_OF_RECORD", "value": "PRESERVED_SPECIMEN" }, { "type": "equals", "key": "FOSSIL_SPECIMEN", "value": "2475471" } ] }, { "type": "equals", "key": "HAS_COORDINATE", "value": "true" }, { "type": "equals", "key": "HAS_GEOSPATIAL_ISSUE", "value": "false" }, { "type": "greaterThanOrEquals", "key": "YEAR", "value": "1949" }, { "type": "lessThanOrEquals", "key": "YEAR", "value": "2011" }, { "type": "greaterThanOrEquals", "key": "MONTH", "value": "3" }, { "type": "lessThanOrEquals", "key": "MONTH", "value": "8" } ] } Best, Markus On 13 Jan 2017, at 21:35, Scott Chamberlain <myrmecocystus@gmail.com<mailto:myrmecocystus@gmail.com>> wrote: Hi! A rgbif user is asking me about a particular download query, see https://github.com/ropensci/rgbif/issues/245 TLDR: AFAICT this can't work as the API is set up right now. Or am I wrong? That is, he wants to get data for records that match - 10 taxa with their taxonKey value - 3 different basisofrecord values - country = US - hasCoordinate = TRUE - hasGeospatialIssue = FALSE - year range between 1949 and 2011 - month range between 3 and 8 For the taxonKey values, I think he needs to combine those with OR operator: "predicate": { "type": "or", "predicates": [ { "type": "equals", "key": "TAXON_KEY", "value": "2475470" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475470" } ] } However, he should combine the other parameters (basisofrecord, hasCoordinate, year, month, etc) using AND AFAICT. BUT, AFAICT the API only allows one predicate key so you can't do what I think is needed here. That is, to say (taxonkey = 1 OR 2 OR 3) + (country = US AND hasCoordinate = true, etc.) I tried sending two predicate keys in the API and only the second goes through. Any guidance much appreciated :) The best solution I can think of is to do the query he's doing, but do one for each taxon. Seem like a good solution? Best, Scott _______________________________________________ API-users mailing list API-users@lists.gbif.org<mailto:API-users@lists.gbif.org> http://lists.gbif.org/mailman/listinfo/api-users

Markus, Thanks, that's it! I just wasn't providing for the ability to do that in the R client. Scott On Fri, Jan 13, 2017 at 3:12 PM Markus Döring <mdoering@gbif.org> wrote:
Hi Scott,
if I understand you correctly you should be able to request a download with a filter like this one that uses a primary AND nested with some ORs:
"predicate": { "type": "and", "predicates": [ { "type": "or", "predicates": [ { "type": "equals", "key": "TAXON_KEY", "value": "2475470" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475471" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475472" } ] }, { "type": "or", "predicates": [ { "type": "equals", "key": "BASIS_OF_RECORD", "value": "PRESERVED_SPECIMEN" }, { "type": "equals", "key": "FOSSIL_SPECIMEN", "value": "2475471" } ] }, { "type": "equals", "key": "HAS_COORDINATE", "value": "true" }, { "type": "equals", "key": "HAS_GEOSPATIAL_ISSUE", "value": "false" }, { "type": "greaterThanOrEquals", "key": "YEAR", "value": "1949" }, { "type": "lessThanOrEquals", "key": "YEAR", "value": "2011" }, { "type": "greaterThanOrEquals", "key": "MONTH", "value": "3" }, { "type": "lessThanOrEquals", "key": "MONTH", "value": "8" } ] }
Best, Markus
On 13 Jan 2017, at 21:35, Scott Chamberlain <myrmecocystus@gmail.com> wrote:
Hi!
A rgbif user is asking me about a particular download query, see https://github.com/ropensci/rgbif/issues/245
TLDR: AFAICT this can't work as the API is set up right now. Or am I wrong?
That is, he wants to get data for records that match
- 10 taxa with their taxonKey value - 3 different basisofrecord values - country = US - hasCoordinate = TRUE - hasGeospatialIssue = FALSE - year range between 1949 and 2011 - month range between 3 and 8
For the taxonKey values, I think he needs to combine those with * OR* operator:
"predicate": { "type": "or", "predicates": [ { "type": "equals", "key": "TAXON_KEY", "value": "2475470" }, { "type": "equals", "key": "TAXON_KEY", "value": "2475470" } ] }
However, he should combine the other parameters (basisofrecord, hasCoordinate, year, month, etc) using *AND* AFAICT.
*BUT*, AFAICT the API only allows one *predicate* key so you can't do what I think is needed here. That is, to say (taxonkey = 1 OR 2 OR 3) + (country = US AND hasCoordinate = true, etc.)
I tried sending two *predicate* keys in the API and only the second goes through.
Any guidance much appreciated :)
The best solution I can think of is to do the query he's doing, but do one for each taxon. Seem like a good solution?
Best, Scott
_______________________________________________ API-users mailing list API-users@lists.gbif.org http://lists.gbif.org/mailman/listinfo/api-users
participants (2)
-
Markus Döring
-
Scott Chamberlain