728x90
반응형
사진 제공:무피드 마즈눈 on 언스플래시

BambooHR 소프트웨어는 직원 수명 주기 전반에 걸쳐 수집한 모든 정보를 수집하고 정리해서, 훌륭한 성과를 달성하도록 도와준다고 해요. 채용, 온보딩, 보상 준비, 문화 구축 등 무엇을 하든 BambooHR은 가장 중요한 자산인 인력에 집중할 수 있는 도구와 통찰력을 제공해 줄 거예요.

해당 회사 정보는 단순히 표나 개별 기록으로 제공되고 표시되는 경우가 많지만, 본질적으로 그래프, 즉 위치, 팀, 부서 등을 포함한 조직 구조라고 할 수 있죠.

BambooHR은 에서 보듯이 REST API를 제공하는데요. 이는 Neo4j Cypher와 함께 APOC를 사용해서 Bamboo에서 데이터를 추출해서 그래프에 로드할 수 있다는 의미랍니다.

아래 예제에서는 BambooHR에서 직원 기록을 추출하고, 조직도에 해당하는 그래프를 효과적으로 작성하는 방법을 보여줄 거예요.

일단 로드되면 Neo4j Browser 또는 Neo4j Bloom을 사용해서 데이터를 시각화할 수 있어요. Bloom의 경우, 특히 계층적 그래프 레이아웃에 사용되는데, 결과는 전통적인 조직도 레이아웃이 될 거예요. BambooHR은 기본적으로 유사한 시각적 조직도 레이아웃을 제공한다는 점에 유의해야 해요. 하지만 Neo4j에서는 데이터를 한 가지 방식으로만 시각화할 필요 없이, 다양한 방식으로 데이터를 `쿼리`하고 탐색하고 확장할 수도 있답니다.

그래프 모델의 경우 다음 `노드`를 사용해요.

  • 직원 (Employee)
  • 위치 (Location)
  • 부서 (Department)

그리고 이러한 `관계`는요:

  • (직원)-[:감독]->(직원)
  • (직원)-[:LIVES_IN]->(위치)
  • (사원)-[:WORKS_IN]->(부서)

다음은 예시 데이터가 포함된 시각적 그래프 모델이에요.

회사 그래프 모델

아래 예제의 목적은 BambooHR에서 데이터를 추출하는 것뿐만 아니라, 다른 소스(이메일, Slack 등)의 다른 데이터와의 `관계`를 구축하는 것이기도 해요.

아래 예는 다음 소프트웨어를 사용해서 구성되었어요.

  • Neo4j 버전: 4.4.3
  • APOC 버전: 4.4.0.1
  • 블룸 버전: 2.0.0

그리고 대부분의 경우 Cypher는 수정이 거의 또는 전혀 없이 이전 Neo4j 버전에서 작동할 거라고 생각해요.

// create schema indexes
create constraint on (e:Employee) assert e.id is unique;
create index on :Employee(name);
create constraint on (l:Location) assert l.name is unique;
create constraint on (d:Department) assert d.name is unique;

Bamboo에서 데이터를 로드하고 이전에 표시된 대로 그래프 모델에 삽입해볼게요. 각 데이터 조각에 대해 고유하게 `노드`를 생성하고 (다음을 사용해서 MERGE) `관계`도 마찬가지로 생성할 거예요. supervisor API의 필드에는 ID가 없지만 감독자의 표시 이름이 포함되어 있으므로, 이름이 중복되면 문제가 발생할 수 있다는 점 기억해주세요.

// consult employee directory
with ‘https://api.bamboohr.com/api/gateway.php/neo4j/v1/employees/directory' as uri,
‘Basic ODI4ZDZmYjViYjNlNmVkYzQ0YmZkNzEyM2Q2YTc0OTlkMzIwOng=’ as bamboo_identifier

CALL apoc.load.jsonParams(uri, 
{Authorization: bamboo_identifier, Accept: ‘application/json’},null)

YIELD value

UNWIND value.employees as row

MERGE (e:Employee {id:row.id})

SET e.firstName=row.firstName, e.lastName=row.lastName,
e.workEmail=row.workEmail, e.name=row.displayName,
e.jobTitle=row.jobTitle

MERGE (l:Location {name:row.location})
MERGE (e)-[:LIVES_IN]->(l)

MERGE (d:Department {name:row.department})
MERGE (e)-[:WORKS_IN]->(d)

MERGE (boss:Employee {name:row.supervisor})

MERGE (boss)-[:SUPERVISES]->(e);

원한다면 고용 날짜 같은 추가 정보를 가져올 수도 있어요.

// now GET each employee

MATCH (e:Employee) WHERE e.hireDate IS NULL

WITH e,
'https://api.bamboohr.com/api/gateway.php/neo4j/v1/employees/' + e.id + ‘/?fields=hireDate’ AS uri,

‘Basic ODI4ZDZmYjViYjNlNmVkYzQ0YmZkNzEyM2Q2YTc0OTlkMzIwOng=’ AS bamboo_identifier

CALL apoc.load.jsonParams(uri,{Authorization: bamboo_identifier, Accept: ‘application/json’},null)

YIELD value

set e.hireDate=value.hireDate;

참고:

여기서 Basic ODI4ZDZmYjViYjNlNmVkYzQ0YmZkNzEyM2Q2YTc0OTlkMzIwOng= AS bamboo_identifier는 제 Bamboo API 키를 나타내요. 이 키는 BambooHR UI의 오른쪽 상단에 있는 프로필을 클릭하고 API 키를 선택하면 BambooHR 내에서 생성할 수 있어요.

생성된 키를 사용하여 base64로 인코딩하고 :x를 키에 추가하세요. 예를 들어, 생성된 키가 828d6fb5bb3e6edc44bfd7123d6a7499d320라면 다음을 실행해야 해요.

echo -n 828d6fb5bb3e6edc44bfd7123d6a7499d320:x | base64

결과는 다음과 같을 거예요.

ODI4ZDZmYjViYjNlNmVkYzQ0YmZkNzEyM2Q2YTc0OTlkMzIwOng=

그리고 https://api.bamboohr.com/api/gateway.php/neo4j/v1/employees/에 대한 참조가 있는데요. 해당 회사 이름이나 ID를 조직의 도메인으로 업데이트해야 해요.

이제 데이터가 Neo4j에 로드되었으니, 어떤 유형의 쿼리를 실행해볼 수 있을까요?

"Customer Support" 부서에는 몇 명이 근무하나요?

MATCH (:Employee)-[:WORKS_IN]->(d:Department) 
WHERE d.name = ‘Customer Support’ 
RETURN count(*);

최대 2개의 Relationships에 있는 모든 직원을 찾아볼까요?

MATCH path=(boss:Employee)-[:SUPERVISES*..2]->(e:Employee) 
WHERE n.jobTitle=’Chief Executive Officer’ 
RETURN path;

Shortest Path로 나와 다른 직원 사이를 연결해볼 수도 있겠죠:

MATCH path=shortestPath(
   (me:Employee)-[:SUPERVISES*..100]-(other:Employee) ) 
WHERE me.name = 'My Name' AND other.name = 'Jane Doe'
RETURN path;

요즘 같은 코로나 상황에서는 특정 Location의 모든 직원을 찾는 것도 유용하겠네요.

MATCH (e:Employee)-[:LIVES_IN]->(l:Location) 
WHERE l.name STARTS WITH ‘San Mateo’ 
RETURN e.name, n.workEmail;

그리고 Neo4j Browser와 Neo4j Bloom 모두에서 데이터가 시각적으로 어떻게 나타나는지 보여주기 위해 공통 데이터세트를 사용할 때 국제 올림픽 위원회 데이터를 사용했어요. 내부 직원 데이터는 공유할 수 없어서 이 공통 데이터 세트를 사용하기로 했답니다.

조직도 IOC

다음은 기본 그래프 표현에서 해당 조직도의 모습이에요.

Neo4j Browser:

Neo4j Bloom:

지금 무료로 클라우드에서 Neo4j Graph Database를 시작해 보세요. 다운로드가 필요 없어요!

도움이 되었으면 좋겠네요. BambooHR을 사용하고 있다면 회사 데이터로 한번 시도해 보고, 만들 수 있는 새로운 통찰력이나 시각화로 동료들을 놀라게 해보세요.


  • BambooHR
  • Data Integration
  • Graph
  • How To
  • Management
  • MDM
  • Organization

에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts