2013-03-10 2 views
0

저는 Cypher를 처음 사용하고 특정 상황에서 쿼리에서 노드를 제외하는 방법을 찾으려고합니다.관계 유형에 따라 결과를 제외하는 Cypher 쿼리

그래프는 (ME-[친구] -person)와 친구 -의 - 친구 관계 친구의 구성 (ME-[FOF] -person)

나는 충분히 쉽게 친구 관계의 모든 친구 (찾을 필요)뿐만 아니라 친구들의 그 친구 제외 '친구'

나는 내가 할 수있는 생각

:

START me=node(0)   
MATCH me-[r:fof]->fof, me-[f?:friend]->fof   
WHERE f is null and NOT(r is null) 
and ... [other filters] 

을하지만이 또한 친구하지 않는 친구의 친구를 얻기에 관하여 갈 길을 잘못 것 같아 .

제안 사항?

답변

9

당신은 WHERE 절에 기존의 관계를 기준으로 필터링 할 수 있으며, 물론 당신은 어떤 조건을 부정하는 NOT를 사용할 수 있습니다

START me=node(0)   
MATCH me-[r:fof]->fof 
WHERE NOT(me-[:friend]->fof) 
and ... [other filters] 
+0

이것은 가장 간단한 처리 시간입니다. 감사! –

2

는 왜이 개 관계 유형을 사용을 : 친구와 FOF를? 친구 관계를 사용하여 전체 친구 그래프를 모델링 한 다음 친구의 친구 인 MATCH (나) - [: friend * 2 ..] -> (친구)와 같은 깊이로 필터링 할 수 있습니다. 친구의 친구를위한 [: friend * 2..2] -> (친구)

+0

속도 문제 일 수 있습니다. – ulkas

+0

필자는 Friend of Friend 관계에서 필 터링/주문해야하는 등록 정보를 가지고 있습니다. 두 노드 사이의 분리 정도에 관계없이이 작업을 수행하는 방법을 찾지 못했습니다. 그러나이 노드에서 잘못된 것으로 입증되기를 바랍니다 :) –

+1

흠 어떤 속성 및 필터링/주문이 필요합니까? – Luanne

0

이 답변은 이미 @ ean5533에서 제공 한 정보 답변 일뿐입니다.

속도가 정말 중요한 경우에, 당신은 당신이 정말로 친구의 친구 모든 경우에 대한 새로운 관계 유형 fof2을 만들려고하지만 친구가 직접 할 수 없습니다 진짜 이상한 친구를 쿼리보다

start n=node(*) 
match n-[:fof]-friend 
where not(n-[:friend]-friend) 
create unique n-[:fof2]-friend; 

을 친구의 속도는 다음과 같습니다.

start n=node(0) 
match p=n-[:fof2]-friend 
return p; 
+0

흥미 롭습니다. @ ean5533의 대답은 즉각적인 문제를 해결하고 또 다른 관계 유형을 유지할 필요가 없다는 데 동의하지만. –