ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Neo4j + Python] Python에서 Neo4j 쿼리 결과 읽기
    Data & ML & AI/GraphDB(Neo4j) 2022. 8. 29. 19:06
    반응형

    지난 글에서는 파이썬에서 local Neo4j DBMS과 세션을 연결해보았습니다.

     

     

    [Neo4j + Python] Python에서 Neo4j DB 접속하고 쿼리하기

    프로젝트 진행을 간소화 하기 위해 Neo4j DB의 노드와 엣지를 만드는걸 자동화 하고싶습니다. 하지만 1) csv파일을 다운받아서 2) Neo4j desktop을 통해 csv를 import해주고, 3) csv를 죄다 로드한 뒤, 4) 그

    brain-nim.tistory.com

    이번에는 읽어온 정보를 객체에 넣어봅시다.

     

     

    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']

     

    반응형

    댓글

Designed by Tistory.