2016-07-12 3 views
1

그래프가 1M 노드입니다. 데이터 모델은 의도적으로 단순합니다. 엔티티와 IDType 노드가 있습니다. 단일 Entity는 1 : 많은 IDType 노드를 가질 수 있습니다. 그리고 IDType 노드는 1 : 많은 엔티티에 연결될 수 있습니다. 이것은 그래프를 형성합니다.Neo4j에서 노드를 함께 클러스터링하는 방법

목표는 함께 연결되는 IDType과 엔티티의 모든 클러스터를 노드 클러스터라고 부르는 것입니다 (일부 그래프는 서브 그래프라고 부름). 1M 노드가 있다고 상상해보십시오. 그래프 데이터에서 이와 같은 "클러스터"를 찾고 싶습니다.이를 수행하는 방법을 찾으려고합니다. 필자는 믿는 사이퍼 쿼리를 작성했지만 의도 한대로 수행하는지는 분명하지 않습니다.

질문 : 그래프를 효율적으로 탐색하고 노드를 클러스터링하여 행 기반 결과 세트로 반환 할 수있는 단일 행 또는 행 그룹이 내 Python 드라이버 프로그램에 설정되어 작동하도록하는 방법 클러스터. 이것이 내 결과의 정확한 구조 일 필요는 없지만 이것은 내가 찾고있는 것에 대한 감각입니다.

클러스터 | 노드 1 | 2,3,4,5,6,7 2 | 10,11,12,13 3 | 15,17,19,20,21,25,27,28, 33

여기서 "클러스터"는 노드 목록을 임의로 클러스터링 한 것입니다 (솔직히 말해서 클러스터의 모음 일 뿐이거나 모든 관련이 있다고 말하는 다른 방법 일 경우 솔직히 말해서 황금입니다) . "nodes"숫자는 모든 Entity 노드에 태그하는 고유 한 정수 기반 속성을 나타냅니다.

쿼리는 다음과 같습니다. 개념은 "엔티티"노드가 1 또는 "ID"노드를 가질 수 있으며 "HAS_ID"관계를 통해 서로 관련된 "엔티티"와 "ID"를 모두 얻으려고하는 것입니다.

개념적 Entity1이 같은 데이터에 존재하는 관계가있는 경우 -> ID1 < --Entity2 -> ID2 < --Entity3 -> ID3 < --Entity4 -> ID4 < - 그런 다음 엔티티 5를 함께 클러스터링하여이 노드 그룹을 나타내는 고유 번호를 생성 할 수 있습니다. 내 예제에는 5 개의 엔티티가 있지만 2 개의 엔티티 또는 50 개의 엔티티가 모두 서로 관련 될 수 있기 때문에 가변 길이 경로가 필요한 것입니다.

다음은이 작업을 그래프에서 시도한 것입니다. 하지만 1) 맞습니까? 2) 무기한으로 작동하는 것처럼 보이기 때문에 효율적입니까? 3) 어떻게 이들을 함께 그룹화하는 것이 가장 좋습니까? ,

match 
(n:Entity)-[e1:HAS_ID*]-(o) 
where n.key <> o.key 
return * 
limit 10 
; 

는 또한

match (n:Entity)-[e1:HAS_ID*]-(o) 
where n.key <> o.key 
with distinct n.key as key_1, o.key as key_2 
return key_1, collect(key_2) 
limit 100 
; 

내가 원하는 가까이 할 보인다 시도했습니다,하지만, 난 여전히 즉, 주어진 키에 대한 하나의 그룹을받지 못했습니다 나는 5 개의 행을 반환 할 수 있습니다. 그러나 그들은 여전히 ​​관련이 있습니다. 나는 그 경우에 1 행을 가질 것입니다. 그는 예를 들어, "49518"키가 첫 번째와 두 번째 행에 있음을 볼 수 있습니다. 오히려 모두 함께 그룹화 한 행이 있어야합니다.

49518 [49004, 49871, 49940, 50525, 49101, 49625, 50165, 50017, 49098, 50383] 
49940 [49088, 49706, 50292, 50470, 49140, 49258, 49216, 49559, 50004, 50346, 49237, 49518, 49894, 49101, 49625, 50165, 50017, 49098, 50383] 

답변

0

음, 귀하의 검색어가 귀하가 설명한 관계 패턴과 일치하지 않습니다.

당신의 패턴에 화살표의 각

은이다 : HAS_ID] 관계, 엔티티와 ID를 항상 각 관계를 교대하는 경우 그래서, 당신의 현재 쿼리는이 같은 패턴과 일치하는 것입니다 :

(:Entity)-[:HAS_ID]->(:ID)<-[:HAS_ID]-(:Entity)-[:HAS_ID]->(:ID)<-[:HAS_ID]-(:Entity) 

3 엔티티, ID 2 개, 관계 4 개. 이는 5 개의 항목, 4 개의 ID 및 8 개의 관계 패턴과 일치하지 않습니다. 적어도 * 8을 사용하기 위해 패턴을 변경하고 싶을 것입니다.

효율성에 관해서 ... 당신이하려고하는 것은 오히려 비효율적 인 것처럼 보일 것입니다. 모든 패턴에 대해이 패턴을 찾아야하기 때문입니다 : 그래프의 엔티티 노드, 모든 것을 시도하십시오 : 발견 된 HAS_ID 관계. 전체 그래프가 Entity와 : ID 및 : HAS_ID와 같은 동일한 패턴으로 만들어진 경우, 쿼리는 한 번이 아닌 여러 번 전체 그래프를 통과하게됩니다.

중복 결과가 나타납니다. 우리의 전체 그래프가 뱀처럼 고립 된 5 개의 엔티티/4 ID/8 관계 체인으로 구성되었다고 가정하더라도 (예를 들어, 엔티티가 체인의 끝에 있거나 ID에 대한 링크 하나가 있거나 가운데에있는 2 개의 ID에 대한 링크가있는 경우), 노드의 동일한 그룹에 대해 2 개의 일치 항목을 얻을 수 있습니다. 하나는 체인의 한쪽 끝에서 일치하고 다른 하나는 다른 끝과 일치합니다. 그리고 그것은 단순한 경우입니다 ... 저는 그래프가 이보다 훨씬 더 복잡 할 수 있다고 생각합니다. 정확히 같은 그룹의 노드에서 일치하는 많은 다른 패턴의 가능성을 허용합니다. 패턴을 사용하는 고유 한 경로가 고유 한 노드 그룹과 일치하지 않습니다.

적어도 패턴을 일치시키고 고유 한 노드 집합을 적용하기 위해 RETURN DISTINCT NODES (p)를 사용하고 싶지만 여전히 일치하는 데는 상당한 시간이 걸릴 것으로 생각됩니다.

+0

신속한 회신과 세부 사항에 감사드립니다. 나는 아직도 곤란하다. (나는 문제의 세부 사항을 너무 잘 설명하지 못해서 위의 질문에 공란을 채울 수 있는지 알 수있다.) – DAE

+0

내 질문을 업데이트했다. 이것이 더 도움이된다면 – DAE

+0

아, 작거나 큰 그룹에 상관없이 전체 그룹을 찾고 있습니다. 각 그룹은 하위 그래프에서 다른 ID 로의 [: HAS_ID] 연결이없는 완전한 하위 그래프 여야합니다. 엔티티? 까다로운 문제 ... – InverseFalcon

관련 문제