2013-10-28 8 views
0

Bio :: DB :: EUtilities를 사용하여 주어진 PMID (Pubmed Id)로 Pubmed DB를 쿼리합니다.Bio :: DB :: EUtilities를 사용하여 pubmed에서 액세스 개요

use Bio::DB::EUtilities; 

use strict; 
use warnings; 

my @ids = (23298400); 
my $factory = Bio::DB::EUtilities->new(-eutil => 'efetch', 
            -email => '[email protected]', 
            -db => 'pubmed', 
            -retmode => 'xml', 
            -id => \@ids); 

$factory -> get_Response(-file => 'pubmed_response.xml'); 

파일에 응답을 작성하고 XML :: Twig를 사용하는 대신 오브젝트 (예 : 추상화)에 직접 액세스하는 방법이 있습니까?

답변

2

$factory->get_abstract과 같은 개체 메서드를 찾는 경우 해당 개체가 존재하지 않습니다. esummary을 사용하면 항목에 초록이 있는지 알려줍니다. 예 :

#!/usr/bin/env perl 

use 5.010; 
use strict; 
use warnings; 
use Bio::DB::EUtilities; 

my @ids = (23298400); 
my $factory = Bio::DB::EUtilities->new(-eutil => 'esummary', 
             -email => '[email protected]', 
             -db  => 'pubmed', 
             -retmode => 'xml', 
             -id  => \@ids); 

while (my $doc = $factory->next_DocSum) { 
    while (my $item = $doc->next_Item('flattened')) { 
     if ($item->get_name eq 'HasAbstract') { 
      printf("%-20s: %s\n",$item->get_name,$item->get_content) if $item->get_content; 
     } 
    } 
} 

이 메시지는 단지 HasAbstract : 1으로 인쇄됩니다. 초록을 얻으려면 몇 가지 옵션이 있습니다. 하나는 efetch을 사용하여 xml을 반환하고 my $xml = $factory->get_Response->content으로 파일에 쓰는 대신 내용을 저장할 수 있으며 그 안에 "Abstract"노드를 찾습니다.

#!/usr/bin/env perl                                     

use 5.010; 
use utf8; 
use strict; 
use warnings; 
use Bio::DB::EUtilities; 
use XML::LibXML; 

my @ids = (23298400); 
my $factory = Bio::DB::EUtilities->new(-eutil => 'efetch', 
             -email => '[email protected]', 
             -db  => 'pubmed', 
             -retmode => 'xml', 
             -id  => \@ids); 

my $xml = $factory->get_Response->content; 

my $xml_parser = XML::LibXML->new(); 
my $dom = $xml_parser->parse_string($xml); 
my $root = $dom->documentElement(); 

for my $node ($root->findnodes('//*[text()]')) { 
    my $name = $node->nodeName(); 
    if ($name eq 'Abstract') { 
     for my $child ($node->findnodes('*')) { 
      binmode STDOUT, ":utf8"; 
      say $child->textContent(); 
     } 
    } 
} 

이 코드는 추상적 인 (이 내가 biostars에 제공하지만 여기 완전성을 포함 같은 대답이다) 인쇄합니다. 또 다른 옵션은 Bash 스크립트에서 curl을 사용하거나 Perl 스크립트에서 LWP::UserAgent을 사용하여 직접 쿼리를 구성하는 것입니다. EFetch에 대한 지침을 보면 retmode을 "text"로 설정하고 rettype을 "abstract"로 설정할 수 있음을 알 수 있습니다. 또한 "예제"섹션에는 PMID가있는 쿼리를 작성하여 요약 텍스트 만 얻는 방법에 대한 몇 가지 예제가 있습니다.

BioPerl 메서드를 사용하면 훨씬 많은 정보에 액세스 할 수 있지만 직접 파싱 (또는 API 읽기)을해야 할 수도 있습니다. 또는, 만약 당신이 관심있는 것이라면 단지 초록을 가져올 수 있지만, 그 접근법은 출판물과 관련된 다른 정보가 아니라 초록만을 얻고 있다는 점에서보다 제한적입니다.