이 블로그는 Couchbase N1QL을 사용한 FHIR 데이터 모델이라는 주제를 다룬 이전 포스팅의 후속 글입니다. 이 블로그에서는 Synthea에서 제공하는 합성 FHIR 데이터를 사용하여 다양한 FHIR 검색 패턴이 Couchbase에서 어떻게 작동하는지에 대한 실제 예제를 포함하여 Couchbase 서비스를 통해 FHIR 검색 REST API 서버를 구현하는 방법에 대한 주제에 대해 설명합니다.
이에 대한 배경 정보는 이전 블로그를 참조하세요. 카우치베이스 N1QL을 사용한 FHIR 데이터 모델.
관심이 있는 이유
- 귀사는 FHIR을 준수하는 전자 건강 기록 시스템(EHR)을 개발할 계획이며 분산, 고가용성, XDCR 및 다차원 확장성과 같은 NoSQL 데이터베이스의 다양한 이점을 활용하려고 합니다.
- 아키텍트 또는 개발자로서 Couchbase JSON 데이터베이스가 복잡한 FHIR 검색을 대체하여 애플리케이션의 복잡성을 크게 줄일 수 있는 방법을 이해하고 있습니다.https://www.hl7.org/fhir/searchparameter-registry.html] 처리를 데이터베이스 서버 계층으로 전송합니다.
- 데이터 분석가로서 SQL 지식을 활용하여 다음을 사용하여 FHIR 데이터를 직접 쿼리하는 방법을 이해하고자 합니다. 카우치베이스 N1QL 및 전체 텍스트 검색.
- 다음과 같이 본질적으로 계층적 및 관계형인 JSON 데이터 모델을 쿼리하는 효율적인 방법을 제공하는 JSON용 SQL인 Couchbase N1QL에 대해 알아보고자 합니다. HL7 관리 모듈.
카우치베이스를 사용한 FHIR 애플리케이션
위의 다이어그램은 일반적인 FHIR 애플리케이션에 관련된 프로세스를 보여줍니다. FHIR Rest 서버는 이 애플리케이션의 중심이며, FHIR에서 지정한 검색 사양을 지원해야 합니다. https://www.hl7.org/fhir/search.html. REST 서버는 클라이언트 애플리케이션 간의 모든 상호 작용을 관리하고 FHIR 검색 요청을 N1QL 문으로 변환하여 Couchbase 쿼리 서비스에 요청을 제출합니다.
카우치베이스로 FHIR 서버를 설정하는 방법
단일 서버 또는 노트북에서 Couchbase FHIR API 서버와 Couchbase NoSQL 데이터베이스를 설정할 수 있습니다. 설정 과정에는 다음이 필요합니다:
- 카우치베이스 서버 6.5 설치하기.
- Synthea 데이터를 카우치베이스 서버에 로드합니다.
- 닷넷 FHIR 서버 코드를 배포합니다.
다음 지침을 따르세요. https://github.com/AV25242/dotnet-fhir-server-couchbase.git
FHIR 샘플 데이터 세트
FHIR 검색을 사용하여 쿼리를 시작하기 전에 FHIR 샘플 데이터 세트에 대해 알아봅시다.
- Synthea 데이터 세트는 1K 개의 합성 환자 기록으로 구성됩니다.
- 환자 기록은 FHIR 리소스 번들 형식으로 되어 있으며, 이는 환자 기록에 환자의 모든 관련 FHIR 개체가 포함되어 있음을 의미합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"실무자" "ImagingStudy" "MedicationRequest" "조건" "장치" "진단 보고서" "CarePlan" "만남" "케어팀" "클레임" "절차" "예방 접종" "관찰" "약물 관리" "조직" "Goal" "ExplanationOfBenefit" "알레르기 과민증" |
이 데모의 목적을 위해 환자 리소스 번들은 개별 리소스 유형 문서로 정규화되어 객체의 참조 ID를 통해 직접 또는 간접적으로 FHIR 객체를 쿼리할 수 있습니다.

FHIR 모델은 다음과 같은 내용을 전달하기 위해 관계와 함께 표시됩니다.
FHIR 검색
원하는 REST 클라이언트를 사용하여 REST API 서버를 테스트할 수 있습니다. 간단하게 하기 위해 저는 터미널에서 CURL을 사용합니다.
1. FHIR 리소스 검색
1 |
>curl -X GET http:///Fhir/api/Patient |
1 |
>curl -X GET http:///Fhir/api/Practitioner |
2. 아이디로 리소스 검색
모든 FHIR 리소스에는 ID 식별자가 있으며 직접 검색할 수 있습니다.
1 |
>curl -X GET http:///Fhir/api/Patient/8850c4aa-cb77-4659-8373-980882405846 |
1 |
>curl -X GET http:///Fhir/api/Patient?id=8850c4aa-cb77-4659-8373-980882405846 |
1 |
>curl -X GET http:///Fhir/api/Organization?id=d32bd7bd-4211-34d8-a08b-b1b2b810d41b |
3. 최상위 필드에서 리소스 검색
"베이사이드 메디컬 센터"에서 제공한 모든 보험금 청구 검색
1 |
>curl -X GET http:///Fhir/api/Claim?provider.display=베이스테이트 메디컬 센터 |
4. 이름으로 리소스 검색 - N1QL 배열 검색
FHIR 리소스에는 리소스 이름을 캡처할 수 있는 포괄적인 구조가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"name": [ { "가족": "마법사", "주어진": [ "Buffy" ], "접두사": [1 항목], "사용": "공식" }, { "가족": "슈나이더", "주어진": [ "Tootsie" ], "접두사": [1 항목], "사용": "maiden" } ] |
이름에 대한 FHIR 검색은 환자가 사용할 수 있는 모든 다른 이름을 고려해야 합니다.
1 |
>curl -X GET http:///Fhir/api/Patient/?name=Buffy |
5. 의료 식별자로 환자 검색 - N1QL 배열 검색
FHIR은 리소스에 대한 식별자도 지원합니다. 아래 예에서 환자는 SSN과 OID로 식별할 수 있습니다(FHIR 시스템이 아닌 경우).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
"patient": { "주소": [1 항목], "birthDate": "1946-11-29", "커뮤니케이션": [1 항목], "deceasedDateTime": "1983-03-25T09:56:18-08:00", "확장": [7 항목], "gender": "여성", "id": "b495844d-22d0-4045-a00d-99f6799df265", "식별자": [ {2 항목}, {3 항목}, { "시스템": "http://hl7.org/fhir/sid/us-ssn", "type": {2 항목}, "value": "999-46-2135" }, { "시스템": "urn:oid:2.16.840.1.113883.4.3.25", "type": {2 항목}, "value": "S99963447" }, {3 항목} ], "결혼 상태": {2 항목}, "multipleBirthBoolean": false, "name": [1 항목], "resourceType": "환자", "텔레콤": [1 항목], "text": {2 항목} } |
SSN 식별자로 환자 검색
1 |
>curl -X GET http:///Fhir/api/Patient?identifier=http://hl7.org/fhir/sid/us-ssn|999-46-2135 |
6. 의료 시스템/코드별 리소스 검색 - N1QL 배열 검색
FHIR은 의료 코드를 사용하여 절차, 관찰 또는 진단 보고서를 식별합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
"진단 보고서": { "category": [1 항목], "code": { "코딩": [ { "code": "57698-3", "display": "지질 패널", "시스템": "http://loinc.org" } ], "text": "지질 패널" }, "effectiveDateTime": "2016-08-17T14:24:27-07:00", "만남": {1 항목}, "id": "38f2e919-894c-4277-ba00-372c18c9cced", "발행": "2016-08-17T14:24:27.878-07:00", "resourceType": "진단 보고서", "결과": [4 항목], "status": "final", "subject": {1 항목} } |
시스템 및 코드로 진단보고서 검색하기
1 |
>curl -X GET http:///Fhir/api/DiagnisticReport?code=http://loinc.org|57698-3 |
7. 전화/이메일로 리소스 검색 - N1QL 배열 검색
FHIR 레코드는 '텔레콤' 필드에 리소스에 대한 모든 통신 채널을 캡슐화합니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
"텔레콤": [ { "시스템": "이메일", "사용": "일", "value": "Quinton758.Hammes673@example.com" }, { "시스템": "전화", "사용": "home", "value": "555-270-6484" } ] |
통신에 대한 FHIR 검색은 리소스가 사용할 수 있는 다양한 통신 유형을 모두 고려해야 합니다.
전화로 환자 검색
1 |
>curl -X GET http:///Fhir/api/Patient/?phone=555-270-6484 |
이메일로 실무자 검색
1 |
>curl -X GET http:///Fhir/api/Practioner/?email=Quinton758.Hammes673@example.com |
전화로 병원 검색
1 |
>curl -X GET http:///Fhir/api/Organization/?phone=978-524-7933 |
8. 날짜 범위를 사용하여 리소스 검색 - N1QL 범위 스캔
FHIR 개체에는 이벤트가 발생한 기간을 나타내는 날짜/시간 범위가 포함될 수 있습니다.
1 2 3 4 |
"performedPeriod": { "end": "2011-07-06T23:03:22-07:00", "시작": "2011-07-06T22:48:22-07:00" }, |
두 날짜 사이에 발생한 검색 절차
1 |
>curl -X GET http:///Fhir/api/Procedure?performedPeriod.start=ge2011-07-07&performedPeriod.end=le2011-07-08 |
9. 텍스트 검색으로 리소스 검색 - Couchbase FTS
FHIR 검색 사양에는 텍스트 검색 기능도 포함되어 있습니다. '_text' 필드를 사용한 검색 요청은 서버에 모든 텍스트 필드에 대해 텍스트 검색을 수행하도록 지시합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
"조건": { "abatementDateTime": "2019-06-01T20:53:48-07:00", "임상 상태": {1 항목}, "code": { "코딩": [1 항목], "text": "발목 골절" }, "만남": {1 항목}, "id": "f2e4b232-513c-4222-9568-6fbe096bb6ba", "onsetDateTime": "2019-04-02T20:53:48-07:00", "recordedDate": "2019-04-02T20:53:48-07:00", "resourceType": "조건", "subject": {1 항목}, "verificationStatus": {1 항목} } |
텍스트 설명에 '골절'이라는 용어가 포함된 조건을 검색합니다.
1 |
>curl -X GET http:///Fhir/api/Condition?_text=Fracture |
텍스트 설명에 '콜레스테롤'이라는 용어를 사용하여 관찰을 검색합니다.
1 |
>curl -X GET http:///Fhir/api/Observation?_text=Cholesterol |
10. 관련 객체로 환자 검색 - N1QL JOIN
FHIR 데이터 모델은 본질적으로 관계형입니다. 환자와 연관된 객체는 제목 필드에 환자의 ID를 포함합니다. 환자에게는 여러 개의 케어플랜이 있으며, 케어플랜에는 해당 케어플랜이 환자에게 속해 있음을 나타내는 환자 ID가 포함된 주제 필드가 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
"careplan": { "활동": [2 항목], "주소": [1 항목], "careTeam": [1 항목], "category": [1 항목], "만남": {1 항목}, "id": "49b2239e-da9c-447a-9e7c-f5721339cf2f", "intent": "주문", "기간": { "시작": "2015-03-22T21:38:17-07:00" }, "resourceType": "CarePlan", "status": "active", "subject": { "참조": "urn:uuid:9aa55fa8-0422-4ca4-bc22-099aea53a590" }, "text": {2 항목} } |
subject.reference 필드를 사용하여 FHIR REST 서버는 환자와 관련 개체 간에 데이터베이스 조인을 구현하여 플랜 ID 값을 가진 특정 플랜을 소유한 환자 기록을 검색할 수 있습니다.
1 |
>curl -X GET http:///Fhir/api/Patient?CarePlan.id=49b2239e-da9c-447a-9e7c-f5721339cf2f |
특정 관찰 코드가 있는 모든 환자 검색하기
1 |
>curl -X GET http:///Fhir/api/Patient?Observation.code=http://loinc.org|29463-7 |
특정 질환을 앓은 모든 환자 검색하기
1 |
>curl -X GET http:///Fhir/api/Patient?Condition.code.text=고혈압 |
Couchbase가 FHIR 서버를 구축하기에 더 나은 플랫폼인 이유
FHIR 서버에 대한 빠른 Google 검색은 30만 개의 결과를 반환하며, HL7 FHIR 구현 페이지에는 12개 이상의 오픈 소스 프로젝트가 나열되어 있습니다. 이미 구축된 FHIR 서버 구현은 다음에서도 이용할 수 있습니다. 많은 공급업체. 이러한 구현은 기존 RDBMS와는 다른 데이터베이스 기술뿐만 아니라 현재 시장에 나와 있는 많은 NoSQL 데이터베이스에 의존합니다.
그리고 dotnot-fhir-server-couchbase 는 Couchbase 플랫폼을 사용하여 FHIR 검색 사양을 구축하는 방법에 대한 몇 가지 예제를 제공합니다. 이 코드는 FHIR API 검색 API 및 매개 변수를 Couchbase N1QL 문으로 변환한 다음, 모든 처리가 처리되는 Couchbase 쿼리 서비스에 제출합니다. 이 접근 방식은 REST 서버 또는 REST 클라이언트 애플리케이션의 복잡성을 줄일 수 있습니다. 몇 가지 주의할 점이 있습니다:
- FHIR JSON 데이터는 카우치베이스 데이터 서비스에 있는 그대로 저장됩니다. 서버에 FHIR 문서를 POST/GET해야 할 때 사전/사후 처리가 필요하지 않습니다.
- Couchbase N1QL 쿼리 언어에는 FHIR JSON 형식의 계층적 데이터 처리를 지원하는 다양한 작업 세트가 있습니다. 환자의 상태, 관찰, 치료 및 진단 보고서를 설명하는 데 사용되는 데이터와 같이 중첩된 데이터 배열에 원활하게 액세스할 수 있습니다.
- 텍스트 검색에 대한 FHIR 요구 사항은 다음을 사용하여 Couchbase 전체 텍스트 검색에서 직접 충족할 수 있습니다. N1QL 검색() 함수를 사용하면 검색을 Lucene, ElasticSearch 또는 Solr에 매핑할 필요가 없습니다.
- FHIR 연쇄 검색 사양은 요청을 처리하기 위해 데이터베이스에 여러 검색을 제출하는 FHIR 서버 구현이 필요할 수 있습니다. 그러나 N1QL을 사용하면 ANSI 조인 쿼리를 통해 훨씬 더 간단한 코드로 요구 사항을 충족할 수 있습니다.
요약
FHIR Rest 서버는 모든 유형의 플랫폼에서 구현되고 있습니다. 검색 프로토콜은 비교적 단순하며, 특정 속성을 기준으로 환자 및 기타 FHIR 관련 개체를 검색하는 데 중점을 두고 있습니다. 검색 API는 REST 클라이언트를 JSON 데이터 형식의 기본인 복잡한 계층 및 배열 처리로부터 보호합니다. 그러나 현재 사양은 그대로 유지됩니다:
- 단순한 상위 및 하위 기능 외에 관련 정보로 환자(또는 다른 FHIR 개체)를 쿼리할 수 있는 명확한 방법을 정의하지 않습니다.
- 집계가 지원되지 않으므로 분석 기능이 제한됩니다.
이러한 제한으로 인해 REST 클라이언트 애플리케이션은 FHIR 데이터 모델을 트래버스하는 로직을 포함해야 하므로 더욱 복잡해질 수 있습니다. 이 블로그 문서의 예제 REST 서버 API 코드는 다음 세 가지 핵심 사항을 설명합니다.
- Couchbase N1QL 배열 구성을 사용하여 배열 요소에 대한 검색을 구현하는 것이 간단합니다.
- 카우치베이스 쿼리 서비스로 푸시 다운하여 관련 개체를 사용하여 환자 개체에 대한 검색을 수행하는 기능입니다. 사실상 N1QL ANSI JOIN을 활용하는 것이 지원됩니다.
- FHIR 검색 사양에서 제안하는 대로 ElasticSearch나 Solr과 같은 전용 FTS 플랫폼을 사용할 필요 없이 전체 텍스트 검색 기능을 Couchbase N1QL과 원활하게 통합할 수 있는 기능입니다.
또한 모든 Couchbase SDK의 수석 제품 관리자인 아룬 비제이라가반에게 감사의 말씀을 전하고 싶습니다. 닷넷-fhir-서버-카우치베이스 코드와 FHIR 검색 구현을 검토하는 데 도움을 주신 고객 여러분의 피드백을 참고해 주세요. 질문이나 피드백이 있거나 환경 설정에 문제가 있는 경우 알려주시기 바랍니다.
리소스
- 빠른 의료 상호 운용성 리소스: https://www.hl7.org/fhir/index.html
- SyntheticMass: "제이슨 월로노스키, 마크 크레이머, 조셉 니콜스, 안드레 퀴나, 크리스 모에셀, 딜런 홀, 칼튼 더펫, 쿠다와시 듀베, 토마스 갤러거, 스콧 맥라클란, Synthea: 합성 환자 및 합성 전자 의료 기록을 생성하기 위한 접근 방식, 방법 및 소프트웨어 메커니즘, 미국 의료 정보학 협회 저널, 25권 3호, 2018년 3월, 230-238페이지, https://doi.org/10.1093/jamia/ocx079"
- N1QL 튜토리얼: https://query-tutorial.couchbase.com/tutorial/#1
- FHIR 검색 매개변수: https://www.hl7.org/fhir/searchparameter-registry.html
안녕하세요, 감사합니다만 다음에서 신시아 샘플 데이터를 다운로드 할 수 없습니다. https://storage.googleapis.com/synthea-public/synthea_sample_data_fhir_r4_sep2019.zip
를 따르는 동안 : https://github.com/AV25242/dotnet-fhir-server-couchbase.git.
샘플 데이터를 얻을 수 있는 방법이 있나요?
안녕하세요 로알루 - 파일이 이동되었을 수 있습니다. 하지만 SyntheticMass 사이트에서 여전히 찾을 수 있습니다. https://synthetichealth.github.io/synthea-sample-data/downloads/synthea_sample_data_fhir_r4_sep2019.zip
-binh