-
[Neo4j + Python] Python에서 Neo4j 쿼리 결과 읽기Data & ML & AI/GraphDB(Neo4j) 2022. 8. 29. 19:06반응형
지난 글에서는 파이썬에서 local Neo4j DBMS과 세션을 연결해보았습니다.
이번에는 읽어온 정보를 객체에 넣어봅시다.
1. 세션 연결 후 쿼리 실행
from neo4j import GraphDatabase # Initialize connection to database driver = GraphDatabase.driver('bolt://localhost:7687', auth=('neo4j', '0000')) session = driver.session() # Run the query q = 'MATCH (n) RETURN n LIMIT 5' results = session.run(q) print(results) # <neo4j.work.result.Result object at 0x0000028AE434C5B0>
간단하게 노드 5개만 가져오겠습니다.
이때 nodes의 타입은 neo4j.work.result.Result이며,
단순하게 print하거나 객체에 저장하는 것만으로는 내부 정보를 읽기 어렵습니다.
2. 쿼리 결과 읽기
# Run the query q = 'MATCH (n) RETURN n LIMIT 5' results = session.run(q) results = list(results) print(results) # 출력값 [<Record n=<Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}>> <Record n=<Node id=1 labels=frozenset({'Person'}) properties={'born': 1964, 'name': 'Keanu Reeves'}>> <Record n=<Node id=2 labels=frozenset({'Person'}) properties={'born': 1967, 'name': 'Carrie-Anne Moss'}>> <Record n=<Node id=3 labels=frozenset({'Person'}) properties={'born': 1961, 'name': 'Laurence Fishburne'}>> <Record n=<Node id=4 labels=frozenset({'Person'}) properties={'born': 1960, 'name': 'Hugo Weaving'}>>]
일단, 단순히 session.run(q)로만 끝내지 말고 list화 하면 쿼리 결과를 읽을 수 있습니다.
그럼 이번엔 하나의 노드의 상세 내용을 읽어봅시다.
record = results[0] # print(record) 출력값 <Record n=<Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}>> node = record[0] # node = record['n']으로도 가능합니다. # print(node) 출력값 <Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}>
record는 node와 다릅니다.
이 예시에서는
'MATCH (n) RETURN n LIMIT 5'와 같이, 하나의 record가 단 하나의 노드(n)만을 포함했지만,
'MATCH (n)-[r]-() RETURN n,r LIMIT 5'에서라면 하나의 record가 (n)과 (r) 두개의 정보를 포함하고 있을겁니다.
이 예시는 글 마지막에 추가해두록 하겠습니다.
그럼 이제 쿼리 결과를 파이썬에서도 사용 가능하도록 추출해봅시다.
3. 쿼리 결과 상세히 읽고 가져오기
node = record['n'] >>> node <Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}> >>> node.items() dict_items([('tagline', 'Welcome to the Real World'), ('title', 'The Matrix'), ('released', 1999)]) >>> node.keys() dict_keys(['tagline', 'title', 'released']) >>> node.values() dict_values(['Welcome to the Real World', 'The Matrix', 1999]) >>> node.get('title') 'The Matrix'
- .items() : property 정보를 [(키, 값)] 으로 불러옵니다.
- .keys() : 각 키의 이름들을 리스트로 가져옵니다.
- .values() : 각 값들을 리스트로 가져옵니다.
- .get('키 이름') : 특정 키의 값을 가져올 수 있습니다.
+ 추가
### len(record) == 1 인 예시 (위의 내용과 동일) ### q = 'MATCH (n) RETURN n LIMIT 2' results = list(session.run(q)) record = results[0] print(record) # 출력값 <Record n=<Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}> > node = record['n'] ### len(record) !=1 인 예시 ### q = 'MATCH (n)-[r]-() RETURN n,r LIMIT 2' results = list(session.run(q)) record = results[0] print(record) # 출력값 <Record n=<Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}> r=<Relationship id=7 nodes=(<Node id=8 labels=frozenset() properties={}>, <Node id=0 labels=frozenset({'Movie'}) properties={'tagline': 'Welcome to the Real World', 'title': 'The Matrix', 'released': 1999}>) type='ACTED_IN' properties={'roles': ['Emil']}> > node = record['n'] relation = record['r']
반응형'Data & ML & AI > GraphDB(Neo4j)' 카테고리의 다른 글
[Neo4j + Python] Python에서 Neo4j DB 접속하고 쿼리하기 (0) 2022.08.28 Neo4j csv파일 열기(LOAD CSV) (0) 2022.07.11 Neo4j 제약조건 생성하기(CONSTRAINT: unique, Not Null) (0) 2022.07.07 Neo4j Cypher 기본구문(Create, Match, Merge 절) (0) 2022.06.09 Neo4j의 기본 구성요소(Elements of Neo4j; study with Movies Project Tutorial) (0) 2022.06.09