Rust+Oxigraph를 통한 서버 SPARQL 엔드포인트 구축

지금까지 AWS Lambda와 API Gateway에서 SPARQL 엔드포인트를 이동해 왔습니다.
https://qiita.com/uedayou/items/bdf7a802e27fe330044e
https://qiita.com/uedayou/items/18f968e3d07b5aa2db50
이번에는 Rust로 제작된Oxigraph을 사용해 AWS 서버에서 어디에서도 이동할 수 없는 프로그램을 제작했다.
https://github.com/uedayou/oxigraph-sparql-api-serverless
여기 소개oxigraph-sparql-api-serverless합니다.

SPARQL이란 무엇입니까?


SPARQL는 RDF용 검색 언어다.SPARQL 조회를 통해 검색할 수 있는 엔드포인트는 이미 공개DBpediaWikidata 등 다양한 정보를 담았다.
자세한 내용은 아래의 내용을 참조하시오.
https://qiita.com/uedayou/items/9e4c6029a2cb6b76de9f

사용법


oxigraph-sparql-api-serverless Rust를 사용하여 AWS Lambda 함수 섹션을 구현했습니다.Docker를 사용하여 Amazon Linux2에 구축AWS SAM CLI하여 AWS에 추출합니다.

구축


SPARQL 엔드포인트에서 검색할 RDF 파일을 터틀로 준비하십시오.
이름dump.ttl을 바꾸고 디렉토리rdf/를 덮어씁니다.
다음 Docker 명령을 사용하여 Rust 프로그램을 구성합니다.
$ cd oxigraph-sparql-api-serverless/
$ docker image build -t oxigraph-build -f Dockerfile.build .
$ docker container run --rm -v $PWD:/code -v $HOME/.cargo/registry:/root/.cargo/registry -v $HOME/.cargo/git:/root/.cargo/git oxigraph-build
구축이 완료되면 생성lambda.zip됩니다.

프로그램 설계


AWS SDK 또는 AWS SAM CLI를 설치하고 설정 후 디버깅을 수행하십시오.
$ sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket {デプロイ用S3バケット}
$ sam deploy --template-file packaged.yaml --stack-name {スタック名} --capabilities CAPABILITY_IAM
depro를 복사한 후 표시되는 URL(예: https://${ID}.execute-api.${Region}.amazonaws.com/Prod/)은 다음과 같이 액세스하면 SPARQL 엔드포인트 동작으로 사용됩니다.
https://${ID}.execute-api.${Region}.amazonaws.com/Prod/sparql?query={URLエンコードされたSPARQLクエリ}&format={json(デフォルト) か xml}

성능


검색 속도


과거 제작된Node.js/Quadstore 버전,Java/apache Jena 버전처럼 검색 속도를 측정했다.
두 기사는 공개된 2020년판 RDF 파일(총 160491의 3배)과 다음 3가지 SPARQL 조회를 사용했다.
이번에도 같은 조건에서 진행됐다.
(1) 100개 3배 얻기
select * where {?s ?p ?o} limit 100
(2) 모든 3배수 얻기
select (count(*) as ?count) where {?s ?p ?o}
(3)filter로 문자열 축소
prefix schema: <http://schema.org/>
prefix org:   <http://www.w3.org/ns/org#>
prefix dbpedia: <http://dbpedia.org/ontology/>

select * where {
  ?uri dbpedia:originalName ?name;
  org:hasSite/org:siteAddress/schema:addressRegion ?pref.
  filter( regex(?pref, "東京") )
}
limit 10
결과는 다음과 같다.
개별 설치
(1)
(2)
(3)
Rust/Oxigraph
88ms
279ms
80ms
Node.js/Quadstore
220ms
12910ms
12910ms
Java/Apache Jena
141ms
579ms
104ms
Node.Js/Quadstore와 Java/apache Jena를 비교하기 위한 결과도 게재됐다.모든 Rust/Oxigraph 결과가 가장 빠릅니다.

첫 번째 부팅 시간


AWS Lambda에는 콜드 스타트가 있는데, 처음 프로그램을 실행할 때 초기화하는 데 시간이 걸린다는 문제가 있다.
Rust/Oxigraph 및 노드.js/Quadstore, Java/APache Jena 세 개의 AWS Lambda로 실행할 때 초기 소요 시간(Init Duration)을 조사했습니다.
개별 설치
초기 소요 시간
메모리 크기
Rust/Oxigraph
81.96 ms
1024MB
Node.js/Quadstore
383.82 ms
1024MB
Java/Apache Jena
3690.75 ms
2048MB
※ 초기에 걸리는 시간은 일정하지 않으며, 상황에 따라 이보다 더 오래 걸릴 수도 있습니다.
결과적으로 Rust/Oxigraph는 여기서도 최초였다.

총결산


지금까지 자바/스페이스 제나 버전이 냉열 가동 문제를 외면했다면 가장 안정적인 성능을 기대할 수 있었지만, Rust/Oxigraph 버전의 냉열 가동 문제도 거의 무시할 수 있었고, 15만3배라면 검색 속도도 비교적 안정적이어서 충분히 활용할 수 있을 것으로 생각했다.
다만, RDF 파일 100만3배 이상을 시도한 뒤 전체 스캔을 하는 쿼리(예: filterorder by는 Rust/Oxigraph 버전(10초 이상)보다 검색 속도가 빨라 상황에 따라 자바/apache Jena 버전(1초 미만)이 유리할 수 있다.
옥시그래프는 2021년 3월까지만 해도 버전이 젊었고, 최적화는 현재부터 시작될 예정이어서 앞으로 큰 기대가 있을 것으로 보인다.
Rust/Oxigraph 버전 검색은 다음과 같이 시도할 수 있습니다.
ISIL(International International Standard Idential Identerprise) 파일럿 LOD

좋은 웹페이지 즐겨찾기