跳转到主要内容

Python 中的 FHIRPath 实现。

项目描述

简介

https://img.shields.io/travis/nazrulworld/fhirpath.svg Documentation Status Test Coverage Python Versions Language grade: Python https://img.shields.io/pypi/v/fhirpath.svg License Downloads HL7® FHIR®

FHIRPath 规范性发布(v2.0.0)的 Python 实现,同时提供对 FHIR 搜索 API 和查询(我们称之为 fql(FHIR 查询语言))API 的支持,以从任何数据源(数据库)获取 FHIR 资源。这个库采用类似于 ORM 的方法构建。我们的目标是使产品符合 100%(尽可能多)的 FHIRPath 规范性发布(v2.0.0)规范。

用法

这个库是一种抽象类型,其中实现了FHIRPath规范发布(v2.0.0)中的所有规范,而不是完整的解决方案(可直接使用)。这种设计模式的主要原因是支持多个数据库系统以及任何框架,没有依赖关系。

fhirpath从不关心创建索引、映射(elasticsearch)和数据存储,如果您想使用这个库,您必须通过以下任何现有提供商(见下表)或创建自己的提供商(不应该太难)。

简单示例

假设

  1. Elasticsearch服务器7.x.x已安装。

  2. 映射和索引是手动处理的。

  3. 数据(文档)也是手动存储的。

创建连接和引擎

>>> from fhirpath.connectors import create_connection
>>> from fhirpath.engine.es import ElasticsearchEngine
>>> from fhirpath.engine import dialect_factory
>>> from fhirpath.enums import FHIR_VERSION

>>> host, port = "127.0.0.1", 9200
>>> conn_str = "es://@{0}:{1}/".format(host, port)
>>> connection = create_connection(conn_str, "elasticsearch.Elasticsearch")
>>> connection.raw_connection.ping()
True
>>> engine = ElasticsearchEngine(FHIR_VERSION.R4, lambda x: connection, dialect_factory)

基本搜索

>>> from fhirpath.search import Search
>>> from fhirpath.search import SearchContext

>>> search_context = SearchContext(engine, "Organization")
>>> params = (
....    ("active", "true"),
....    ("_lastUpdated", "2010-05-28T05:35:56+00:00"),
....    ("_profile", "http://hl7.org/fhir/Organization"),
....    ("identifier", "urn:oid:2.16.528.1|91654"),
....    ("type", "http://hl7.org/fhir/organization-type|prov"),
....    ("address-postalcode", "9100 AA"),
....    ("address", "Den Burg"),
.... )
>>> fhir_search = Search(search_context, params=params)
>>> bundle = fhir_search()
>>> len(bundle.entry) == 0
True

基本查询

>>> from fhirpath.enums import SortOrderType
>>> from fhirpath.query import Q_
>>> from fhirpath.fql import T_
>>> from fhirpath.fql import V_
>>> from fhirpath.fql import exists_
>>> query_builder = Q_(resource="Organization", engine=engine)
>>>  query_builder = (
....    query_builder.where(T_("Organization.active") == V_("true"))
....    .where(T_("Organization.meta.lastUpdated", "2010-05-28T05:35:56+00:00"))
....    .sort(sort_("Organization.meta.lastUpdated", SortOrderType.DESC))
.... )
>>> query_result = query_builder(async_result=False)
>>> for resource in query_result:
....    assert resource.__class__.__name__ == "OrganizationModel"
>>> # test fetch all
>>> result = query_result.fetchall()
>>> result.__class__.__name__ == "EngineResult"
True

>>> query_builder = Q_(resource="ChargeItem", engine=engine)
>>> query_builder = query_builder.where(exists_("ChargeItem.enteredDate"))
>>> result = query_builder(async_result=False).single()
>>> result is not None
True
>>> isinstance(result, builder._from[0][1])
True

>>> query_builder = Q_(resource="ChargeItem", engine=engine)
>>> query_builder = query_builder.where(exists_("ChargeItem.enteredDate"))
>>> result = query_builder(async_result=False).first()
>>> result is not None
True
>>> isinstance(result, builder._from[0][1])
True

可用提供商(已知)

目前可用的提供商数量非常有限,但更多即将推出。

fhirpath-guillotina

一个由guillotina框架支持的提供商,内置电池,可直接使用!请遵循相关文档。

  1. 引擎:Elasticsearch

  2. PyPihttps://pypi.ac.cn/project/fhirpath-guillotina/

  3. https://github.com/nazrulworld/fhirpath_guillotina

collective.fhirpath

一个由Plone支持的提供商,与fhirpath-guillotina一样,所有内容都包含在内,可直接使用,尽管依赖于plone.app.fhirfield

  1. 引擎:Elasticsearch

  2. PyPihttps://pypi.ac.cn/project/collective.fhirpath/

  3. https://github.com/nazrulworld/collective.fhirpath

未列出

你在等什么呢?欢迎在这里列出你的提供商!开发提供商不应该太难,因为fhirpath为你提供了方便的API。

Elasticsearch自定义分析器

为了获得引用类型字段的一些特殊搜索功能,您需要为您elasticsearch索引设置自定义分析器。

自定义分析器示例

settings = {
    "analysis": {
        "normalizer": {
            "fhir_token_normalizer": {"filter": ["lowercase", "asciifolding"]}
        },
        "analyzer": {
            "fhir_reference_analyzer": {
                "tokenizer": "keyword",
                "filter": ["fhir_reference_filter"],
            },
        },
        "filter": {
            "fhir_reference_filter": {
                "type": "pattern_capture",
                "preserve_original": True,
                "patterns": [r"(?:\w+\/)?(https?\:\/\/.*|[a-zA-Z0-9_-]+)"],
            },
        },
        "char_filter": {},
        "tokenizer": {},
    }

映射示例(引用字段)

"properties": {
  "reference": {
    "type": "text",
    "index": true,
    "store": false,
    "analyzer": "fhir_reference_analyzer"
}

待办事项

  1. fhirbase引擎(即提供商实现)。

  2. 所有方法和函数都在FHIRPath规范中定义,将会完成。

  3. 实现https://github.com/ijl/orjson

  4. https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust/

致谢

此包骨架是用Cookiecutteraudreyr/cookiecutter-pypackage项目模板创建的。

© 版权所有 HL7®标志、FHIR®标志和燃烧的火焰是Health Level Seven International的注册商标。

“FHIR®是HL7的注册商标,其使用得到HL7的许可。FHIR商标的使用并不代表HL7对该产品的认可”

历史

0.10.5 (2020-12-17)

改进

  • BundleWrapper提供了两个可选方法,calculate_fhir_base_urlresolve_absolute_uri,现在也接受可选参数base_url

修复 - 修复了ElasticSearchDialect.create_term [Kartik Sayani]

  • 修复了EngineResult.extract_references。 [Jason Paumier]

  • 修复了复合搜索参数的解析方式。[Jason Paumier]

  • 问题#28 嵌套GroupTerm搜索无匹配结果

  • 修复了复合搜索参数的SearchContext.normalize_param。[nazrulworld]

0.10.4 (2020-11-19)

  • 修复了FHIRAbstractModel与BundleWrapper的utils模块的比较。[nazrulworld]

  • fallback_callable辅助函数可在utils模块中使用。

0.10.3 (2020-11-17)

改进

  • 创建了更多辅助函数(get_local_timezonetimestamp_utctimestamp_utc)。

  • initial_bundle_data方法现在在Base Elasticsearch引擎类中可用,这意味着可以在派生类中构建Bundle初始数据,从而提供更多灵活性。

错误修正

  • 默认的bundle初始数据在构建时使用了utc now时间但未添加时区偏移,因此在json序列化时遗漏了时区信息,导致Bundle的逆向构建时报告验证错误。

0.10.2 (2020-11-06)

改进

  • orjson不再需要。现在json_dumpsjson_loads动态支持orjsonsimplejson

0.10.1 (2020-11-04)

错误修正

  • Connection.raw_connection被错误地用self包装,而不是用elasticsearch.AsyncElasticsearch/elasticsearch.Elasticsearch实例。

0.10.0 (2020-11-04)

改进

  • 引入了基于asyncio的连接和引擎AsyncElasticsearchConnection`AsyncElasticsearchEngine。见在Elasticsearch中使用Asyncio

  • 默认情况下添加了基于orjson的json序列化器(当从连接工厂建立连接时)。

  • 添加了对_summary=text|data|count|true|false的支持。[arkhn]

  • 添加了对_elements搜索参数的支持。[arkhn]

重大变更

  • async_result参数对于SearchContext,Search和Query(包括异步版本)不再需要,因为现在所有引擎都包含该信息(engine_class.is_async())。

0.9.1 (2020-10-24)

  • 添加了对_format_pretty参数的支持,现在不应再忽略它们。[nazrulworld]

0.9.0 (2020-10-24)

  • 处理引用搜索参数中的:identifier修饰符。[simonvadee]

  • 修复了BundleWrapper`的as_json模式,现在包括resourceType值。[nazrulworld]

  • fhirpath.search.fhir_search中添加了Dict响应选项。[nazrulworld]

  • 忽略空搜索参数 #21 [simonvadee]

  • 为了性能优化,最低要求的zope.interface版本是5.1.2

0.8.1 (2020-10-05)

  • fhirpath.utils.BundleWrapper中禁用pydantic验证。[simonvadee]

  • 现在在utils模块下可用两个辅助函数json_dumpsjson_loads。[nazrulworld]

  • 仅对受影响的类型应用搜索前缀 #17 [simonvadee]

0.8.0 (2020-09-25)

改进

重大变更

  • fhirpath.search.SearchContext.resource_name 已更改为 fhirpath.search.SearchContext.resource_type,现在数据类型为 List 而不是字符串。请检查您的 API。[Jasopaum]

  • 对于基于 Elasticsearch 的引擎,您应该为 FHIR 引用类型使用自定义分析器(fhir_reference_analyzer)。有关详细信息,请参阅自述文件。

0.7.1 (2020-08-07)

  • 添加了缺少的 isodate 包依赖项。

0.7.0 (2020-08-07)

改进

  • 问题 #5:现在 ElasticsearchEngine::get_index_name 采取一个可选参数 resource_type

  • 添加对 Python 版本 3.6 的支持。

重大变更

  • 使用 fhir.resources 版本 6.x.x 实现全部功能,请查看 fhir.resources 的革命性变化。

0.6.2 (2020-06-30)

  • fhirspecfhir.resources 版本已锁定。

0.6.1 (2020-05-09)

必须更新的版本(从 0.6.0 开始)!

错误修正

  • 修复:由于以下问题的修复而导致的这些问题。

  • 修复:fhirpath.storage.FHIR_RESOURCE_CLASS_STORAGEfhirpath.storage.PATH_INFO_STORAGEfhirpath.storage.SEARCH_PARAMETERS_STORAGEfhirpath.storage.FHIR_RESOURCE_SPEC_STORAGE 使用错误的 FHIR 版本作为键。

0.6.0 (2020-05-08)

重大变更

0.5.1 (2020-03-18)

新功能

  • __main__ 模块已创建,现在可以查看版本和/或启动所需的 FHIR 版本。例如 python -m "fhirpath" --versionpython -m "fhirpath" --init-setup [nazrulworld]

改进

  • 更新了 elasticsearch 映射的修复版本。

0.5.0 (2020-03-11)

新功能

  • FHIRPath(规范性发布)支持可用。现在有一个专门的类 `fhirpath.FHIRPath,尽管它仍在进行中(这意味着许多方法/函数尚未完成。)

改进

错误修正

  • 建议升级到这个版本,因为它包括几个主要错误修复。

重大变更

  • 已移除 fhirpath.navigator 模块并引入了新的模块 fhirpath.modelfhirpath.utils.Model 已移动到 fhirpath.model`

0.4.1 (2019-11-05)

错误修正

  • fhirpath.search.Search.parse_query_string 现在返回 MuliDict``(预期) 而不是 ``MultiDictProxy

0.4.0 (2019-10-24)

改进

  • 现在完全支持 select 功能,意味着您可以在 select 部分提供多个路径。例如 select(Patient.name, Patient.gender)

  • 支持 FHIRPath count()empty() 函数。

  • 支持在 select 中使用索引和函数进行路径导航。例如 [index]last()first()Skip()Take()count()

更新内容

  • QueryResult.firstQueryResult.single 现在不再返回 FHIR 模型实例,而是返回 fhirpath.engine.EngineResultRow

  • QueryResult.fetchall 返回 fhirpath.engine.EngineResultRow 列表,而不是 FHIR JSON。

  • QueryResult 迭代在条件(如果 select 是 *)下返回 FHIR 模型实例列表,而不是返回 fhirpath.engine.EngineResultRow 列表。

0.3.1 (2019-10-08)

改进

  • 支持包含空格+as 的搜索参数表达式,例如 MedicationRequest.medication as CodeableConcept

错误修正

0.3.0 (2019-09-30)

改进

  • 支持相同搜索参数的多个 AND 值!

  • 增加对 FHIR 版本 STU3 的 Money 类型搜索兼容性支持。[nazrulworld]

  • 添加 IN 查询支持。[nazrulworld]

  • 支持包含 string 路径和 .as() 的 PathElement,因此也支持搜索。

  • 支持在搜索中使用 Duration 类型。

  • 增加支持复合类型搜索参数。

错误修正

  • 支持多个搜索值(IN 搜索)

  • HumanName 和 Address 搜索缺少 text

0.2.0 (2019-09-15)

更新内容

  • 内置提供程序(guillotina_appplone_app)已被删除,因为它们都成为独立的 pypi 项目。

  • queries 模块已从 fql 子包移动到 fhirpath 包,并更名为 query

改进

  • 几乎所有模块都进行了许多改进。

  • FhirSearch 覆盖率增加。

  • 在 Query 以及 FhirSearch 中添加了排序、限制功能。

错误修正

  • 修复了大量的错误。

0.1.1 (2019-08-15)

  • 已发布第一个工作版本。当然,不是完全功能。

0.1.0 (2018-12-15)

  • 在 PyPI 上首次发布。(仅注册目的,完全不可用,下一个版本即将推出)

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。

源分布

fhirpath-0.10.5.tar.gz (96.2 kB 查看哈希值)

上传时间

构建分布

fhirpath-0.10.5-py2.py3-none-any.whl (102.5 kB 查看哈希值)

上传时间 Python 2 Python 3