2013-03-30 3 views
1

John이 상품을 Met에 판매하고 있다고 가정하자. Bob은 Bob과 Alen에게 모두 으로 제품을 판매하고 Alen은 상품을 John에게 다시 판매합니다. 내가 필요로하는 것은이 예에서와 같이 모든 닫힌 원을 반환하는 Cypher 쿼리입니다.John..Met..Alen Alen이 상품을 John에게 다시 판매하여 관계 등록 정보 (금액)가 가장 낮은 폐쇄 서클로 만들기 때문입니다. 어떻게 전체 데이터베이스에서이 작업을 수행 할 수 있습니까? 폐쇄 된 모든 서클과 분당 수량을 가져 오십시오. 감사합니다.닫힌 원 안에 모든 노드 및 관계 속성을 가져옵니다.

답변

3

Stefans 대답부터 시작하여 최소한 경로의 길이를 고려해야합니다.

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p, lenght(p) 

으로 노드 당 단지 최단 경로 길이는 최단 경로를 얻으려면

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return n, min(lenght(p)) 

: http://console.neo4j.org/r/wrm522

:

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
with n, collect(nodes(p)) as nodes, min(length(nodes(p))) as l 
return n, head(filter(p in nodes : length(p) = l)) as shortest_circle,l 

를 예에 대한 Neo4j 콘솔을 참조하십시오

거기에 주목할만한 점은 전체 그래프를 스캔하면 원의 각 노드에 대해 동일한 원을 여러 번 반복합니다.

여기에는 nodes, length, collect, head 및 filter 함수와 min 집계가 사용됩니다. 참조 : http://docs.neo4j.org/chunked/milestone/query-function.html

스테판이 이미 말했듯이 모든 노드를 검색하는 것은 매우 비용이 많이 듭니다.

0

당신은 같은 쿼리를 할 수있는 :

start n=node(*) 
match p=n-[:SELLS_TO*1..5]->n 
return p 

경우 5 루프의 최대 깊이 표준시.

예를 들어 Neo4j console을 참조하십시오. 그러나 "node (*)"를 사용하면 그래프의 크기에 따라 선형으로 확장되는 전역 쿼리가 트리거됩니다.

+0

닫힌 원에는 괜찮 으면 좋겠지 만 최소 금액은 얼마입니까? –

+0

닫힌 원에 대해 시작 n = node (18) match (n) -> (a) -> (m) -> (s) -> (n) return n, a, m, s; –

관련 문제