2013-11-04 13 views
6

Tôi muốn viết một truy vấn cypher đó tìm tất cả các đường dẫn dài nhất giữa các nút mà có mối quan hệ với STATUS = "on" bất động sản với nhau, đây là những gì tôi đã làm cho đến nay:cách tìm tất cả các đường dẫn dài nhất với truy vấn cypher?

start n=node(*) 
match p = n-[r:INCLUDE*..]->m 

with n,MAX(length(p)) as l 
match p = n-[r:INCLUDE*..]->m 
WHERE all(rel in r 
where rel.status='on' AND (length(p) = l)) 
return p,l 

Nó trả 3 đường dẫn có chiều dài 1,2 và 3, không chỉ đường dài nhất, truy vấn của tôi chỉ tìm đường đi dài nhất, ý tôi là nếu có 8 đường dẫn phù hợp với điều kiện đầu tiên của tôi (where rel.status='on'), với chiều dài 1,2, 3,3,4,6,6,6, chỉ có ba đường dẫn có chiều dài 6 phải được trả lại.

tôi phải làm gì?

hãy hướng dẫn tôi, tôi mới làm quen với neo4j và đã thử rất nhiều nhưng chưa có gì ngoại trừ chóng mặt, tôi sẽ rất biết ơn sự giúp đỡ của bạn.

Trả lời

12

Thử di chuyển tiêu chí thuộc tính mối quan hệ của bạn lên kết quả đường dẫn đầu tiên hoặc bạn sẽ tính toán độ dài tối đa trên các đường dẫn không được lọc theo tiêu chí đó. Sau đó, thực hiện các đường dẫn và chiều dài tối đa vào chân thứ hai của truy vấn để bạn không phải khớp tất cả các đường dẫn một lần nữa. Bạn có thể thu thập các đường dẫn để thực hiện chúng trong mệnh đề WITH và sau đó lọc trên độ dài đường dẫn khi bạn quay trở lại. Hãy thử một cái gì đó như

START n=node(*) 
MATCH p=n-[rels:INCLUDE*]->m 
WHERE ALL (rel IN rels 
    WHERE rel.status='on') 
WITH COLLECT(p) AS paths, MAX(length(p)) AS maxLength 
RETURN FILTER(path IN paths 
    WHERE length(path)= maxLength) AS longestPaths 
+0

là vậy, cảm ơn. – fereshteh

+0

và, làm cách nào tôi nhận được nút cuối cùng của đường dẫn? – fereshteh

Các vấn đề liên quan