Python 中的 FHIRPath 实现。
项目描述
简介
FHIRPath 规范性发布(v2.0.0)的 Python 实现,同时提供对 FHIR 搜索 API 和查询(我们称之为 fql(FHIR 查询语言))API 的支持,以从任何数据源(数据库)获取 FHIR 资源。这个库采用类似于 ORM 的方法构建。我们的目标是使产品符合 100%(尽可能多)的 FHIRPath 规范性发布(v2.0.0)规范。
- 支持 FHIR® STU3 和 R4。 
- 支持多个提供商的引擎。目前支持Plone和guillotina框架的提供商fhirpath-guillotina和collective.fhirpath,并且更多即将推出。 
- 支持多种方言,例如elasticsearch、GraphQL、PostgreSQL。尽管现在elasticsearch已被支持。 
- 提供易于使用的API,全面支持FHIR搜索。 
用法
这个库是一种抽象类型,其中实现了FHIRPath规范发布(v2.0.0)中的所有规范,而不是完整的解决方案(可直接使用)。这种设计模式的主要原因是支持多个数据库系统以及任何框架,没有依赖关系。
fhirpath从不关心创建索引、映射(elasticsearch)和数据存储,如果您想使用这个库,您必须通过以下任何现有提供商(见下表)或创建自己的提供商(不应该太难)。
简单示例
假设
- Elasticsearch服务器7.x.x已安装。 
- 映射和索引是手动处理的。 
- 数据(文档)也是手动存储的。 
创建连接和引擎
>>> 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框架支持的提供商,内置电池,可直接使用!请遵循相关文档。
- 引擎:Elasticsearch 
collective.fhirpath
一个由Plone支持的提供商,与fhirpath-guillotina一样,所有内容都包含在内,可直接使用,尽管依赖于plone.app.fhirfield。
- 引擎:Elasticsearch 
未列出
你在等什么呢?欢迎在这里列出你的提供商!开发提供商不应该太难,因为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"
}
待办事项
- fhirbase引擎(即提供商实现)。 
- 所有方法和函数都在FHIRPath规范中定义,将会完成。 
- https://developers.redhat.com/blog/2017/11/16/speed-python-using-rust/ 
致谢
此包骨架是用Cookiecutter和audreyr/cookiecutter-pypackage项目模板创建的。
© 版权所有 HL7®标志、FHIR®标志和燃烧的火焰是Health Level Seven International的注册商标。
“FHIR®是HL7的注册商标,其使用得到HL7的许可。FHIR商标的使用并不代表HL7对该产品的认可”
历史
0.10.5 (2020-12-17)
改进
- BundleWrapper提供了两个可选方法,calculate_fhir_base_url和resolve_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_timezone,timestamp_utc,timestamp_utc)。 
- initial_bundle_data方法现在在Base Elasticsearch引擎类中可用,这意味着可以在派生类中构建Bundle初始数据,从而提供更多灵活性。 
错误修正
- 默认的bundle初始数据在构建时使用了utc now时间但未添加时区偏移,因此在json序列化时遗漏了时区信息,导致Bundle的逆向构建时报告验证错误。 
0.10.2 (2020-11-06)
改进
- orjson不再需要。现在json_dumps和json_loads动态支持orjson和simplejson。 
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_dumps和json_loads。[nazrulworld] 
- 仅对受影响的类型应用搜索前缀 #17 [simonvadee] 
0.8.0 (2020-09-25)
改进
- 添加对一些重要FHIR搜索参数的支持(_has、_include 和 _revinclude)[simonvadee] 
- 启用对多个资源类型的搜索(_type 搜索参数)[Jasopaum] 
- 问题 #8 如果上下文具有资源类型,则添加无任何参数或查询字符串的搜索支持 [nazrulworld] 
- 问题 #9 多个否定不起作用 [nazrulworld] 
重大变更
- 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)
- fhirspec 和 fhir.resources 版本已锁定。 
0.6.1 (2020-05-09)
必须更新的版本(从 0.6.0 开始)!
错误修正
- 修复:由于以下问题的修复而导致的这些问题。 
- 修复:fhirpath.storage.FHIR_RESOURCE_CLASS_STORAGE、fhirpath.storage.PATH_INFO_STORAGE、fhirpath.storage.SEARCH_PARAMETERS_STORAGE 和 fhirpath.storage.FHIR_RESOURCE_SPEC_STORAGE 使用错误的 FHIR 版本作为键。 
0.6.0 (2020-05-08)
重大变更
- 硬依赖 fhirspec。 
- 所需的最小 Python 版本是 3.7。 
- 所需的最小 fhir.resources 版本是现在 5.1.0,这意味着 FHIR R4 4.0.1 和 STU3 3.0.2。请遵循更改日志 https://pypi.ac.cn/project/fhir.resources/5.1.0/。 
0.5.1 (2020-03-18)
新功能
- __main__ 模块已创建,现在可以查看版本和/或启动所需的 FHIR 版本。例如 python -m "fhirpath" --version、python -m "fhirpath" --init-setup [nazrulworld] 
改进
- 更新了 elasticsearch 映射的修复版本。 
0.5.0 (2020-03-11)
新功能
- FHIRPath(规范性发布)支持可用。现在有一个专门的类 `fhirpath.FHIRPath,尽管它仍在进行中(这意味着许多方法/函数尚未完成。) 
改进
- 添加对重要的 FHIR 搜索修饰符 :contains 的支持。请参阅 https://github.com/nazrulworld/fhirpath/issues/1 
- 添加对 :aboveFHIR 搜索修饰符和 `èb` 前缀的支持。请参阅 https://github.com/nazrulworld/fhirpath/issues/2 
- 添加对 :bellow FHIR 搜索修饰符和 sa 前缀的支持。请参阅 https://github.com/nazrulworld/fhirpath/issues/2 
错误修正
- 建议升级到这个版本,因为它包括几个主要错误修复。 
重大变更
- 已移除 fhirpath.navigator 模块并引入了新的模块 fhirpath.model。 fhirpath.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.first 和 QueryResult.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。 
错误修正
- not 修饰符现在对 Coding 和 CodeableConcept 有效。 
- 在嵌套查询的情况下,“ignore_unmapped”始终为 True。 
- “unmapped_type”现在显式设置为长值。请参阅相关问题 https://stackoverflow.com/questions/17051709/no-mapping-found-for-field-in-order-to-sort-on-in-elasticsearch 
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_app 和 plone_app)已被删除,因为它们都成为独立的 pypi 项目。 
- queries 模块已从 fql 子包移动到 fhirpath 包,并更名为 query。 
改进
- 几乎所有模块都进行了许多改进。 
- FhirSearch 覆盖率增加。 
- 在 Query 以及 FhirSearch 中添加了排序、限制功能。 
错误修正
- 修复了大量的错误。 
0.1.1 (2019-08-15)
- 已发布第一个工作版本。当然,不是完全功能。 
0.1.0 (2018-12-15)
- 在 PyPI 上首次发布。(仅注册目的,完全不可用,下一个版本即将推出) 
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。