Как я могу говорить с UniProt по HTTP в Python?

В GUID есть компонент, основанный на времени, который вы можете изменить, и если вы понимаете последствия, это не приведет к коллизии. О некоторых мыслях вы можете прочитать здесь:

https://blog.stephencleary.com/2010/11/few-words-on-guids.html

соответствующий раздел гласит:

GUID на основе времени (версия 1) GUID на основе времени - это вариант 2, GUID версии 1 RFC 4122, также известный как «последовательные GUID», потому что они могут генерироваться со значениями, очень близко друг к другу. Они состоят из трех полей в дополнение к варианту и версии: 60-битная метка времени UTC, 14-битная тактовая последовательность и 48-битный идентификатор узла.

Идентификатором узла обычно является MAC-адрес компьютера, генерирующего основанный на времени GUID (который гарантированно будет уникальным, поскольку MAC-адреса используют систему регистрации). Однако это также может быть 47-битное случайное значение (с установленным широковещательным битом). В этом случае нет опасности столкновения с реальными MAC-адресами, поскольку широковещательный бит физического MAC-адреса всегда равен 0. Однако существует опасность столкновения с другими случайными идентификаторами узлов; в частности, вероятность столкновения составляет 50%, если в сеть войдут 13,97 миллиона случайных узлов.

Примечание. Использование случайного значения вместо MAC-адреса в настоящее время не поддерживается Microsoft Win32 API. Это означает, что любая генерация GUID, выполненная с использованием UuidCreateSequential, будет выставлять MAC-адрес.

Поле «Последовательность часов» инициализируется случайным значением и увеличивается всякий раз, когда системные часы перемещаются назад после последнего сгенерированного GUID (например, если компьютер корректирует свое время с помощью сервера времени или если он потерял свою дату и считает, что это 1980). Это позволяет сбросить 16 384 часов без какой-либо опасности столкновения. Если GUID генерируются так быстро, что системные часы не сдвинулись вперед со времени последней метки времени GUID, тогда алгоритм генерации GUID обычно останавливается до тех пор, пока системные часы не увеличат метку времени.

Последовательные GUID на самом деле не являются последовательными. В обычных условиях идентификаторы GUID, генерируемые одним и тем же компьютером, будут постепенно увеличивать поля меток времени (при этом остальные поля будут оставаться постоянными). Однако поле Timestamp не находится в младших значащих битовых позициях GUID, поэтому, если GUID обрабатывается как 128-битное число, он фактически не увеличивается.

Важно отметить, что вероятность коллизий последовательных идентификаторов GUID чрезвычайно мала. Последовательность часов и метка времени почти наверняка уникально идентифицируют момент времени, а идентификатор узла почти наверняка идентифицирует уникальный источник.

Последовательные GUID могут быть созданы с помощью функции Win32 UuidCreateSequential или с помощью uuidgen.exe из Windows SDK, передав параметр -x.

blockquote>

Вы также можете просмотреть соответствующую спецификацию здесь:

https://tools.ietf.org/html/rfc4122#section-4.1.1

5
задан bignose 1 May 2009 в 05:49
поделиться

3 ответа

вопрос № 1:

Это может быть сделано с помощью urllibs Python:

import urllib, urllib2
import time
import sys

query = ' '.join(sys.argv)   

# encode params as a list of 2-tuples
params = ( ('from','ACC'), ('to', 'P_REFSEQ_AC'), ('format','tab'), ('query', query))
# url encode them
data = urllib.urlencode(params)    
url = 'http://www.uniprot.org/mapping/'

# fetch the data
try:
    foo = urllib2.urlopen(url, data)
except urllib2.HttpError, e:
    if e.code == 503:
        # blah blah get the value of the header...
        wait_time = int(e.hdrs.get('Retry-after', 0))
        print 'Sleeping %i seconds...' % (wait_time,)
        time.sleep(wait_time)
        foo = urllib2.urlopen(url, data)


# foo is a file-like object, do with it what you will.
foo.read()
8
ответ дан 13 December 2019 в 05:42
поделиться

Давайте предположим использование Python 2.5. Мы можем использовать httplib для прямого вызова веб-сайта:

import httplib, urllib
querystring = {}
#Build the query string here from the following keys (query, format, columns, compress, limit, offset)
querystring["query"] = "" 
querystring["format"] = "" # one of html | tab | fasta | gff | txt | xml | rdf | rss | list
querystring["columns"] = "" # the columns you want comma seperated
querystring["compress"] = "" # yes or no
## These may be optional
querystring["limit"] = "" # I guess if you only want a few rows
querystring["offset"] = "" # bring on paging 

##From the examples - query=organism:9606+AND+antigen&format=xml&compress=no
##Delete the following and replace with your query
querystring = {}
querystring["query"] =  "organism:9606 AND antigen" 
querystring["format"] = "xml" #make it human readable
querystring["compress"] = "no" #I don't want to have to unzip

conn = httplib.HTTPConnection("www.uniprot.org")
conn.request("GET", "/uniprot/?"+ urllib.urlencode(querystring))
r1 = conn.getresponse()
if r1.status == 200:
   data1 = r1.read()
   print data1  #or do something with it

Вы могли затем сделать функцию вокруг создания строки запроса, и необходимо отсутствовать.

1
ответ дан 13 December 2019 в 05:42
поделиться

Возможно, вам лучше использовать службу перекрестных ссылок идентификаторов белков из EBI для преобразования одного набора идентификаторов в другой. У него очень хороший интерфейс REST.

http://www.ebi.ac.uk/Tools/picr/

Я должен также упомянуть, что UniProt предлагает очень хорошие доступные веб-сервисы. Хотя, если вы по какой-то причине привязаны к использованию простых HTTP-запросов, это, вероятно, бесполезно.

1
ответ дан 13 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: