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 上首次发布。(仅注册目的,完全不可用,下一个版本即将推出)
项目详情
下载文件
下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于安装包的信息。