5 个版本

0.2.2 2019 年 7 月 23 日
0.2.1 2019 年 6 月 27 日
0.1.2 2019 年 5 月 15 日
0.1.0 2019 年 3 月 10 日

科学 中排名第 301

每月下载 32
用于 论文

MIT/Apache

170KB
3K SLoC

Crossref-rs - Crossref-API 的 Rust 客户端

Build Status Crates.io Documentation

Crossref API 文档

此客户端受 sckott/habanero 启发。

Crossref - Crossref 搜索 API。The Crossref crate 提供与 Crossref API 路由匹配的方法

  • works - /works 路由
  • members - /members 路由
  • prefixes - /prefixes 路由
  • funders - /funders 路由
  • journals - /journals 路由
  • types - /types 路由
  • agency - /works/{doi}/agency 获取 DOI 颁发机构

使用方法

创建 Crossref 客户端

let client = Crossref::builder().build()?;

如果您有 Crossref Plus 服务的授权令牌

let client = Crossref::builder()
    .token("token")
    .build()?;

鼓励使用 礼貌池

礼貌 = 更可靠的服务

要进入 Crossref 的礼貌池,请包含一个电子邮件地址

let client = Crossref::builder()
     .polite("[email protected]")
     .token("your token")
     .build()?;

构造查询

并非所有组件都支持查询,并且每个支持查询的路由都有可用的自定义参数。对于支持查询的资源组件,存在一个 Query 结构:WorksQueryMembersQueryFundersQuery。The WorksQuery 还与其他的不同,因为它支持 使用游标进行深度分页字段查询

否则,对于所有资源组件创建查询的方式都相同


let query = WorksQuery::new("Machine Learning")
    // field queries supported for `Works`
    .field_query(FieldQuery::author("Some Author"))
    // filters are specific for each resource component
    .filter(WorksFilter::HasOrcid)
    .order(Order::Asc)
    .sort(Sort::Score);

获取记录

请参阅 此表 以获取主要组件的详细概述。

有 3 个不同的目标

  • 独立资源组件/works/membersfundersprefixestypes,返回对应项的列表,并可使用查询进行指定。
  • 具有标识符的资源组件/works/{doi}?<query>/members/{member_id}?<query>等,如果找到则返回单个项。
  • works路由结合使用:工作组件可以附加到其他资源上,例如:/members/{member_id}/works?<query>等,返回匹配的Work项的列表,作为WorkList

这类似于资源组件的枚举,例如对于Members

pub enum Members {
    /// target a specific member at `/members/{id}`
    Identifier(String),
    /// target all members that match the query at `/members?query...`
    Query(MembersQuery),
    /// target a `Work` for a specific member at `/members/{id}/works?query..`
    Works(WorksIdentQuery),
}

示例

客户端支持所有选项

通过DOI或ID查询单个项

所有资源组件都有类似的方法

let work = client.work("10.1037/0003-066X.59.1.29")?;

let agency = client.work_agency("10.1037/0003-066X.59.1.29")?;

let funder = client.funder("funder_id")?;

let member = client.member("member_id")?;

查询

let query = WorksQuery::new("Machine Learning");

// one page of the matching results
let works = client.works(query)?;

或者直接插入一个自由形式的查询词

let works = client.works("Machine Learning")?;

Works路由结合

对于除Works之外的所有资源组件,都存在方法可以附加一个具有ID选项的WorksQuery,例如/members/{member_id}/works?<query>?

use crossref::*;
fn run() -> Result<()> {
    let client = Crossref::builder().build()?;
    let works = client.member_works(WorksQuery::new("machine learning")
    .sort(Sort::Score).into_ident("member_id"))?;
    Ok(())
}

这将与通过提供组合类型使用Crossref::works方法相同。

use crossref::*;
fn run() -> Result<()> {
    let client = Crossref::builder().build()?;
    let works = client.works(WorksQuery::new("machine learning")
     .sort(Sort::Score)
     .into_combined_query::<Members>("member_id"))?;
    Ok(())
}

**Works的深度分页** 深度分页结果 支持所有查询,返回一个WorkWorkList的列表。这个函数返回一个新迭代器,遍历Work页面,由crossref作为大量项以WorkList的形式返回。通常单个WorkList包含20个项。

示例

遍历与搜索词Machine Learning链接的所有Works

use crossref::{Crossref, WorksQuery, Work};
fn run() -> Result<(), crossref::Error> {
    let client = Crossref::builder().build()?;
    
    let all_works: Vec<Work> = client.deep_page(WorksQuery::new("Machine Learning")).flat_map(|x|x.items).collect();
    
    Ok(())
}

可以简化为

use crossref::{Crossref, WorksQuery, Work};
fn run() -> Result<(), crossref::Error> {
    let client = Crossref::builder().build()?;
    
    let all_works: Vec<Work> = client.deep_page("Machine Learning").into_work_iter().collect();
    
    Ok(())
}

通过组合查询遍历具有id funder id的资助者的所有页面(WorkList)。单个WorkList通常包含20个Work项。

use crossref::{Crossref, Funders, WorksQuery, Work, WorkList};
fn run() -> Result<(), crossref::Error> {
    let client = Crossref::builder().build()?;
    
    let all_funder_work_list: Vec<WorkList> = client.deep_page(WorksQuery::default()
            .into_combined_query::<Funders>("funder id")
      )
        .collect();
    
    Ok(())
}

直接遍历特定资助者的所有Work项。

use crossref::{Crossref, Funders, WorksQuery, Work, WorkList};
fn run() -> Result<(), crossref::Error> {
    let client = Crossref::builder().build()?;
    
    let all_works: Vec<Work> = client.deep_page(WorksQuery::default()
         .into_combined_query::<Funders>("funder id"))
         .into_work_iter()
         .collect();
    
    Ok(())
}

命令行应用程序

安装

cargo install crossref --features cli

使用方法

顶级子命令

USAGE:
    crossref <SUBCOMMAND>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

SUBCOMMANDS:
    funders     Query crossref funders
    help        Prints this message or the help of the given subcommand(s)
    journals    Query crossref journals
    members     Query crossref members
    prefixes    Query crossref prefixes
    types       Query crossref types
    works       Query crossref works

组件子命令的附加选项(查询、排序、排序和限制仅支持子命令 <works|funders|members>,并且被现有的--id选项覆盖)

USAGE:
    crossref works [FLAGS] [OPTIONS] [SUBCOMMAND]

FLAGS:
    -a, --append       if the output file already exists, append instead of overwriting the file
    -d, --deep-page    Enable deep paging. If a limit is set, then the limit takes priority.
    -h, --help         Prints help information
    -s, --silent       do not print anything
    -V, --version      Prints version information

OPTIONS:
    -i, --id <id>                    The id of component.
    -l, --limit <limit>              limit the amount of results
        --offset <offset>            Sets an offset where crossref begins to retrieve items.
        --order <order>              How to order the results: asc or desc
    -o <output>                      output path where the results shall be stored
        --polite <polite>            The email to use to get into crossref's polite pool
    -q, --query <query_terms>...     The free form terms for the query
        --sample <sample>            Request randoms Elements. Overrides all other options.
        --sort <sort>                How to sort the results, such as updated, indexed, published, issued
        --token <token>              The token to use for the crossref client
        --user-agent <user_agent>    The user agent to use for the crossref client

示例

通过DOI检索特定作品

 crossref works --id "10.1037/0003-066X.59.1.29"

将结果保存为json

 crossref works --id "10.1037/0003-066X.59.1.29" -o output.json

通过它们的ID检索任何其他组件

 crossref <works|journals|members|prefixes|types> --id "10.1037/0003-066X.59.1.29" -o output.json

某些组件支持额外的过滤

crossref <works|funders|members> --query "A search term such as `Machine learning` for works" --limit 10 --offset 200 --order asc

获取特定组件的Works,例如具有id 98的成员。

crossref works member 98

<prefix|funder|prefix|type也以相同的方式支持。

默认情况下,深度分页是禁用的,因此Works的结果最多为20(单个crossref页面)。通过启用--deep-page标志,将收集所有可用结果。

要进入礼貌池,请使用--polite "[email protected]"将您的电子邮件作为请求头提供。

许可

根据以下任一项许可

依赖项

~18–28MB
~492K SLoC