티스토리 뷰

Neo4j

Import RDF

joyHong 2020. 6. 17. 13:15

RDF 형식의 데이터를 Neo4j에 import하기 위해서는 먼저 플러그인을 설치해야 한다.

https://joyhong.tistory.com/122

 

Neosemantics

Neosemantics 는 Neo4j에서 RDF를 사용할 수 있게 해주는 플러그인이다. https://neo4j.com/labs/neosemantics-rdf/ neosemantics (n10s) : Neo4j RDF & Semantics toolkit - Neo4j Graph Database Platform neose..

joyhong.tistory.com

Neosemantics 플러그인을 설치한 후 GraphConfig 설정도 완료하여야 비로소 원하는 바를 이룰 준비가 되어진다.

https://joyhong.tistory.com/123

 

그래프 구성 설정

Neo4j에 RDF 형식의 데이터를 import하기 위해서는 환경 설정이 필요하다. 이 Configuration은 그래프 내에서 데이터를 구성하는 형식에 대하여 설정을 하게 되는데 URI 저장 형식, import한 RDF 데이터 중 Pr

joyhong.tistory.com

 

이번 포스팅에서 import할 RDF 데이터셋은 임의로 만든 트리플들을 사용할 예정이다.

TestModel.ttl
0.00MB

 

 

 

그럼 이제 파일 또는 Web 상의 RDF 데이터를 neo4j에 불러오기를 해보도록 한다.

 

1. 파일 또는 Web상의 RDF 데이터를 neo4j 불러오기

CALL n10s.rdf.import.fetch("file:///D:/ data/TestModel.ttl ","Turtle")

* 여기서는 4.0버전을 사용함

 

import는 n10s.rdf.import.fetch(url, format, params) 를 사용하는데 

첫번째 파라미터는 url로 파일인 경우 file:// 뒤에 파일 경로를 사용하고

웹에 있는 데이터면 http://를 사용하여 지정할 수 있다.

두번째 파라미터는 파일의 형식인데 여기서는 ttl 형식이라 "turtle"을 사용하였다.

세번째는 파라미터인데 생략이 가능하다.

 

2. 파일 또는 Web상의 RDF 데이터를 neo4j 삭제하기

CALL n10s.rdf.delete.fetch("file:///D:/data/TestModel.ttl","Turtle")

 

3. Property필터링하여 불러오기

CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle",
{ predicateExclusionList : [ "http://joyhong.tistory.com/example/sex" ]})

* predicateExclusionList 에 명시한 property를 제외하고 neo4j에 저장한다.

 

위와 같이 데이터를 import할 수 가 있다.

그럼 이제 GraphConfig 를 변경해 가면서 어떠한 형태로 데이터가 import되어 저장되는지 살펴보도록 하겠다.

그전에 GraphConfig를 업데이트 하기 전에 반드시 생성한 노드를 삭제해야 한다. 그렇지 않으면 GraphConfig를 업데이트를 할수가 없게 된다.

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({ handleVocabUris: "KEEP" })

여기서는 두개의 쿼리를 한번에 사용한 것인데 MATCH를 통해 레이블이 Resource인 노드들과 그 노드와 연결된 관계를 모두 지웠고, 두번째로 graphconfig.set을 통해 초기값을 업데이트하였다.

 

 

GraphConfig 파라미터 변경

 

1. handleVocabUris: "SHORTEN" (default)

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({ handleVocabUris: "SHORTEN" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle");

 

이 설정은 기본값이 SHORTEN이기 때문에 기본 초기화와 같다.

Uri prefix가 자동으로 ns1, ns2  할당되어 저장된다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

2. handleVocabUris: "IGNORE"

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({ handleVocabUris: "IGNORE" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

 

IGNORE로 설정하게 되면 Uriprefix는 무시되고 local name만 남는다

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

 

3. handleVocabUris: "KEEP"

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({ handleVocabUris: "KEEP" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

 

KEEP으로 설정하면 Full URI를 유지한다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

 

4. handleMultival: "OVERWRITE" (default)

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({handleMultival : "OVERWRITE" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

 

이 설정은 object 값이 여러개 존재할 때에 대한 처리방식인데 OVERWRITE는 하나만 남겨둔다.

실제 데이터가 아래와 같을 때

결과를 확인해 보면

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

값이 하나만 남아있는 것을 볼 수 있다.

 

 

5. handleMultival: "ARRAY"

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({handleMultival : "ARRAY" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

 

이 설정은 값이 여러개인 경우 List 형태로 저장하게 된다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

6. multivalPropList: ["property list"]

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({ multivalPropList : ['http://joyhong.tistory.com/example/hobby'] });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

multivalPropList은 특정 property에 대해서만 List로 저장할 때 사용할 수 있다.

파라미터가 multivalPropList : ['http://joyhong.tistory.com/example/hobby'] 와 같이 [ ]  형태이기 때문에 복수개의 값을 넣을 수 있다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

 

7. keepLangTag : true

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({keepLangTag: true, handleMultival: "ARRAY" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

keepLangTag의 디폴트는 false이며 true인 경우 언어태그를 유지한다.

n10s.rdf.getLangTag n10s.rdf.getLangValue를 통해 언어태그와 값을 가져올 수 있다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o)
RETURN [x in s.joy__major | n10s.rdf.getLangTag(x)] AS tags, [y in s.joy__major | n10s.rdf.getLangValue("ko",y)] AS values, s.joy__major

 

8. handleRDFTypes: "LABELS" (default)

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({handleRDFTypes: "LABELS" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

rdf:Type에 대하여 처리하는 방식을 지정하는 것으로 디폴트는 uri rdf:type으로 연결된 class명이 노드의 label로 생성된다.

 

실제 데이터는 rdf:type으로 st_1이 Student 클래스의 인스턴스이다.

 

이에 대한 결과는 아래와 같다.

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )
RETURN s, labels(s)

노란색 노드의 레이블로 기본적으로 Resource가 생성되고, joy__Student 레이블이 하나 더 생성되게 된다.

 

 

9. handleRDFTypes: "NODES"

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({handleRDFTypes: "NODES" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

NODES로 설정하게 되면 8번처럼 레이블이 생성되는 것이 아니라 노드가 하나 생성되고 그 노드와의 관계가 rdf__type으로 생성된다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )
RETURN s, labels(s)

 

 

10, handleRDFTypes: "LABELS_AND_NODES"

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.graphconfig.set({handleRDFTypes: "LABELS_AND_NODES" });
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle")

LABELS_AND_NODES로 설정하면 8번과 9번을 동시에 사용하는 것으로 uri rdf:type으로 연결된 class명이 노드의 label rdf__type 관계로 생성된다.

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )
RETURN s, labels(s)

 

 

RDF 데이터를 import 하기 전에 prefix를 지정할 수 있는데 nsprefixes.add ( ) 를 사용하여 원하는 prefix를 설정하면 된다.

 

11. nsprefixes.add ( )

MATCH (resource:Resource) DETACH DELETE resource; 
CALL n10s.nsprefixes.removeAll;
CALL n10s.nsprefixes.add("joy","http://joyhong.tistory.com/example/");
CALL n10s.rdf.import.fetch("file:///D:/data/TestModel.ttl","Turtle");

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

 

마지막으로 ImportRDF data에서 일부 트리플 삭제는 아래와 같이 할 수 있다.

12. n10s.rdf.delete.inline (‘url’, ‘format’, ‘params’)

CALL n10s.rdf.delete.inline('<http://joyhong.tistory.com/example/st_1> <http://joyhong.tistory.com/example/major> "컴퓨터공학과"@ko .',"Turtle", {
  handleMultival: 'ARRAY',
  keepLangTag: true
})

 

결과 확인

MATCH (s{uri:"http://joyhong.tistory.com/example/st_1"} )-[r]-(o) RETURN s, type(r), o

* joy__major컴퓨터공학”@ko property가 삭제됨

 

 

여기까지 모두 실행을 한 결과는 아래와 같이 될 것이다.


참조 :

https://neo4j.com/docs/labs/nsmntx/current/

 

'Neo4j' 카테고리의 다른 글

Neo4J 활용  (0) 2020.08.29
FUll-text search  (0) 2020.06.17
RDF 데이터가 Neo4j에 저장되는 방식  (0) 2020.06.17
그래프 구성 설정  (0) 2020.06.17
Neosemantics  (0) 2020.06.17
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함