2014-11-05 5 views
0

2 백만 노드가 넘는 그래프 데이터베이스가 있습니다. 소셜 그래프를 사용하고 그것에 대한 추론을하는 어플리케이션이 있습니다. 알고리즘의 한 걸음으로 두 개의 연결된 노드의 관계 [: friends]를 가능한 한 모두 조합해야합니다. 현재 다음과 같은 쿼리가 있습니다 : (a) - [: friend] - (c), (b) - [: friend] - (d) 여기서 id (a) = {ida} 및 id (b)) = {IDB는} 난 이미 노드 ab을 알고 난 ab의 친구에서 할 수있는 모든 가능한 쌍을 얻고 싶은, 그래서 두 번째neo4j 데카르트 제품 성능 향상

같은 D, 첫째로 구분 C를 반환합니다. 이것은 분명히 매우 느린 작업입니다. neo4j에서 동일한 결과를 얻는보다 효율적인 방법이 있는지 궁금합니다. 인덱스를 추가하면 도움이 될까요? 어떤 아이디어/단서도 환영합니다!

노드 a 친구 가지고 xy 노드 b 친구 가지고, i`` Then the result should be: X ,g X , H g, h X , I Y ,g Y , H Y , I '

답변

1

아직 라벨을 사용하지 않는 경우 그는 :Person 라벨을 사용하여 노드를 생성 한 당신에 의존 분명히

MATCH (p1:Person)-[:FRIEND]->(p3:Person),(p2:Person)-[:FRIEND]->(p4:Person) 
WHERE ID(p1) = 6 AND ID(p2) = 7 
RETURN p3 as first, p4 as second 

:처럼 보일 수 있습니다 쿼리, 최대 오줌.

평균 노드는 몇 명의 친구가 있습니까?

+0

답장을 보내 주셔서 감사합니다. 왜 이것이 도움이 될지 설명해 주시겠습니까? 평균 친구 수에 대해서는 잘 모르지만 크게 다릅니다. 극소수 (10 미만)에서 수백 또는 심지어 수천에 이릅니다. –

0

두 패턴을 사용하지 않고 하나만 사용하고 IN 연산자를 사용합니다.

MATCH (p:Person)-[:FRIEND]->(friend:Person) 
WHERE id(p) IN [1,2,3] 
RETURN p, collect(friend) as friends 

다음 교차 제품이 없으며 1 인당 소장품으로 친구들을 멋지게 반품 할 수도 있습니다.