2016-08-02 2 views
2

tinkerpop 플러그인이있는 titan 그래프 db를 사용하고 있습니다. has 단계를 사용하여 정점을 검색하는 가장 좋은 방법은 무엇입니까?그래프를 통해 정보를 얻는 가장 좋은 방법은 무엇입니까?

employeeId는 고유 한 정점 중심 인덱스가 정의 된 고유 속성이라고 가정합니다.

라벨 를 통해인가 즉 GV().가 (레이블, '직원'). ('employeeId를', 'emp123') GV(). ('직원', 'employeeId를'을 가지고, 'emp123있다 ')

(또는) 고유 속성을 기반으로 정점을 직접 검색하는 것이 좋습니다. 예 : g.V(). ('employeeId', 'emp123')

두 가지 방법 중 가장 빠른 방법은 무엇입니까?

답변

3

먼저 당신이 인덱스를 만들 수있는 옵션이 있습니다. 옵션 2의 경우 g.V().has('employee','employeeId','emp123')을 사용해야합니다.

g.V().hasLabel('employee').has('employeeId','emp123') 모든 직원을 먼저 선택하십시오. Titan은 먼저 색인을 활용할 수있는 필터 조건을 적용 할만큼 똑똑합니다.

내가 지적하고자하는 또 하나의 점은 다음과 같습니다. indexOnly()의 요점은 다른 유형의 정점 사이에서 속성을 공유 할 수 있도록하는 것입니다. 그래서 등, 대신 재산 employeeId를 호출, 당신은 그것을 uuid를 호출 할 수 있고 또한 고용주, ​​회사를 위해 그것을 사용 g.V().has('<label>','<prop-key>','<prop-value>') :

mgmt.buildIndex('employeeById', Vertex.class).addKey(uuid).indexOnly(employee).buildCompositeIndex() 
mgmt.buildIndex('employerById', Vertex.class).addKey(uuid).indexOnly(employer).buildCompositeIndex() 
mgmt.buildIndex('companyById', Vertex.class).addKey(uuid).indexOnly(company).buildCompositeIndex() 

쿼리는 다음 항상이 패턴을해야합니다.우리가 글로벌 인덱스을 완전히 없애 버렸기 때문에 이것이 실제로 DSE 그래프로 갈 수있는 유일한 방법입니다. 모든 유형의 정점에 걸쳐 있습니다. 처음에 나는이 결정을 정말로 좋아하지 않았지만, 한편으로 이것은 훨씬 더 깨끗하다는 데 동의해야합니다.

+0

대니얼 덕분에 정말 도움이되었습니다. –

+0

대니얼, 그런 좋은 설명을 고맙습니다. 그것은 나를 위해 구름을 깨끗이 닦았다. 이제 우리는 gremlin 쿼리를 가능한 한 타이탄과 DSE 구문에 적합한 방식으로 작성하여 DSE로 마이그레이션 할 수 있습니다 (필연적 인 경우). 최소한 tussle로 수행 할 수 있습니다. :) – Phani

1

두 번째 옵션 g.V().has('employeeId','emp123')은 성능 향상을 위해 employeeId 속성이 indexed 인 한 더 낫습니다.

이것은 gremlin 탐색의 각 단계가 필터를 작동하기 때문입니다. 그래서 당신은 말할 때 : 먼저 레이블 employee 모든 정점으로 이동 한 후 직원의 정점에서 당신이 emp123을 찾을

g.V().has(label,'employee').has('employeeId','emp123') 

.

g.V().has('employeeId','emp123')으로 합성 색인을 사용하면 올바른 정점으로 직접 이동할 수 있습니다.

편집 : 다니엘로

는 그의 대답에 지적은, 타이탄은 모든 직원이 방문 할 정도로 실제로 똑똑하고 즉시 인덱스를 활용합니다. 따라서이 경우 트래버스 간에는 약간의 차이가 있음이 나타납니다. 개인적으로 레이블없이 직접 글로벌 인덱스를 사용하는 것이 좋습니다 (즉, 첫 번째 탐색). Titan을 사용할 때 선호도에 불과하므로 단계와 필터를 최소한으로 유지하려고합니다. 옵션의 경우 1

  1. mgmt.buildIndex('byEmployeeId', Vertex.class).addKey(employeeId).buildCompositeIndex()
  2. mgmt.buildIndex('byEmployeeId', Vertex.class).addKey(employeeId).indexOnly(employee).buildCompositeIndex()

그것을하지 않습니다 정말 아무리 당신이 사용하는거야 쿼리하는 :

+0

나는 최근까지 Filipe와 동의하고 이것이 나의 생각 과정이기도하다. 그러나 https://academy.datastax.com/courses/ds330-datastax-enterprise-graph에서 DSE 그래프 비디오 자습서를 살펴본 후 색인 생성이 완전히 정점 중심으로 발생하고 비디오의 예가 'gV(). hasLabel ('employee'). has ('employeeId', 'emp123')'구문을 옹호한다. 이제 나는 위의 추론이 잘되는 지 확신하지 못한다! DSE 그래프와 Titan에서 색인 생성이 완전히 다르다는 것을 알고 있지만 접근 방식 2가 정확하다는 사실을 이중으로 확인하고 싶습니다. – Phani

+0

@Phani 필자는 제안한 첫 번째 탐색이 더 좋다고 생각하지만 Titan만이 그렇게 생각합니다. 저는 DSE를 많이 사용하지 않았기 때문에 색인 작성 방법을 잘 모릅니다. 꼭 꼭지점 중심 일 수 있습니다. 링크를 가져 주셔서 감사합니다, 나는 나중에 그것을 체크 아웃합니다. –

관련 문제