2017-11-14 24 views
3

neo4j (또한 neo4j 그래프 데이터베이스 책에서도)가 만든 관계형 dbms에 대한 네이티브 스토리지를 사용하는 그래프 dbms를 선호하는 논점은 "인덱스없는 인접성"이 데이터를 처리하는 가장 효율적인 방법이라는 것입니다. 그래프 (그래프 기반 모델에서 데이터/노드의 '클러스터링'으로 인해).Neo4j 확장 성과 인덱싱

3 개의 노드가 순차적으로 (A-> B < -C) 연결되어 있으며 A의 ID가 주어진 경우 수행 한 일부 벤치마킹에 따라 C에 대해 쿼리 할 때 확장 성이 명확하게 O (n) 일 때 1M, 5M, 10M 및 20M 노드가있는 데이터베이스에 대해 동일한 쿼리를 테스트합니다. 내 쿼리를 1 노드로만 제한하고 있으므로 모든 노드가 일치하는지 검사해야한다는 점을 고려하면 합리적입니다 (제한된 이해로). 그러나 쿼리 된 노드 속성을 인덱싱 할 때 동일한 쿼리의 실행 시간은 상대적으로 일정합니다.

그림은 인덱싱 전후의 데이터베이스 노드 크기에 따른 실행 시간을 보여줍니다. 주황색 그림은 O (N) 기준선이며 파란색 그림은 관찰 된 실행 시간입니다. Query execution time with number of nodes in a (number of) neo4j database(s). First graph shows before indexing, graph below indicates after indexing the queried property

인덱스 기반의 인접성의 이점이 어디에서 오는 것인지 알아 내려고합니다.이 링크는 깊이 (어) 링크에 대해 1 제한으로 쿼리 할 때 유리합니까? 예 : A -> B -> C -> D -> E에서 4의 깊이를 가지며 A가 주어진 E를 쿼리합니다.이 경우 A에 대해 단 하나의 일치가 있음을 알기 때문에 (따라서 모든 다른 이 서브 네트워크의 일부가 아닌 노드).

이것은 쿼리에 크게 의존하므로 아래에 참조 용으로 Cypher 쿼리의 예를 나열합니다 (여기서 id가 1 인 노드와 레이블이 지정된 엔티티가 일치하고 위의 B 노드를 반환 함). 예)와 세컨더리 링크 노드 위의 예에서 (C))

MATCH (:entity{id:1})-[:LINK]->(result_assoc:assoc)<-[:LINK]-(result_entity:entity) RETURN result_entity, result_assoc 

UPDATE/ADDITIONAL INFORMATION

This source 상태 "인덱스없이 인접하는 키 메시지는 인 것을 전체 그래프를 통과하는 복잡성은 O (n)입니다. 여기서 n은 노드의 수입니다. 대조적으로, 모든 색인을 사용하면 복잡성 O (n log n)을 갖게됩니다. ". 이 문장은 색인 생성 전에 O (n) 결과를 설명합니다. 색인 생성 후 O (1) 성능은 해시 목록 성능 (?)과 동일하다고 생각합니다. 왜 다른 인덱스를 사용하여 복잡도가 O (n log n)인지는 모르겠지만 해시 목록을 사용하더라도 최악의 경우는 O (n)입니다.

+2

하향 투표가 쉽습니다. 왜 더 나은 질문을 공식화하는 것이 더 도움이 될지 논평하는 것. – dter

+1

Neo4j 서적은 RM (관계형 모델)을 오해하고 오해합니다. 오해 중 하나는 RM이 구현과 관련이 있다는 것입니다. 관계는 추상입니다. 어쨌든 "색인"은 밀짚 맨입니다. 여러 구현 구조를 사용할 수있는 이점은 여러 값을 스캔하지 않고 쿼리를 수행 할 때 쿼리가 향상된다는 것입니다. 궁극적으로 그들은 단지 RDBMS가 아닌 특정 유스 케이스에 최적화되어 있다고 말하고 있습니다. 꼬리가 개를 휘젓습니다. https://stackoverflow.com/a/28799902/3404097 – philipxy

+0

@philipxy 테스트의 개념은 노드의 수에 따라 실행 시간이 어떻게 달라지는 지에 대한 아이디어를 얻는 것이 었습니다. 전반적인 경향은 절대 값 이상 이었기 때문에 아키텍처와 시스템 이 경우 일정하게 유지되었다. 확장 성의 선형성으로 인해 인덱스 비어있는 인접성의 장점은 무엇입니까? 최악의 인덱스의 키가 벌써 선형 인 경우 그래서 차이점을 확인하기 위해 색인 테스트를 실행했습니다. 이것은 거의 O (1)을 얻습니다. 이것은 해시리스트의 최상의 성능입니다. 나는 색인 자유로운 adjacency가 유리한 방법 보지 않는다. – dter

답변

2

필자가 생각하기에, 인덱스없는 aspect는 인접한 노드들에 대해서만 관련이있다. (그래서 index-free adjacency이라고 불린다. 귀하의 플롯에서 보여주고있는 것, A을 찾을 때, C을 찾을 수있는 추가 시간은 무시할 수 있으며, 색인을 사용할지 여부를 묻는 질문은 초기에 쿼리 된 노드 A을 찾는 것입니다.

인덱스가없는 A을 찾으려면 데이터베이스의 모든 노드를 스캔해야하기 때문에 O (n)이 필요하지만 인덱스가 있으면 실제로는 해시리스트와 유사하며 O (1) (단서 없음 왜 책에 O (n log n)라고 쓰여 있는지).

그 외에도 Neo4j는 A에 연결되어 있기 때문에 인접 노드를 찾는 것이 어렵지 않습니다. 반면 RM에서는 링크가 명확하지 않으므로 비용이 많이 들고 조인/필터가 필요합니다. . 따라서 장점을 실제로 보려면 관계/링크의 깊이를 변경하여 그래프 DB와 RM DB의 성능을 비교해야합니다. 엔티티 노드의 이웃 노드가 증가 할 때 쿼리가 어떻게 수행되는지 보는 것도 흥미로울 것입니다 (즉, 그래프가 더 조밀 해짐). Neo4j는 결코 너무 조밀하지 않은 그래프에 의존합니까? 그렇지 않으면 이웃을 통해 올바른 것을 찾는 문제는 반복됩니다.