2017-03-29 4 views
0

특정 레이블이있는 노드를 확장 및 검색하고 싶습니다. 그러나 나는 또한 특정 레이블 경로의 노드를 필터링 싶어요. "; 사람 엔티티", 레이블 열은 같은 값 포함 "엔티티를, 조직"ArangoDB : 속성을 검색하고 경로의 여러 값을 필터링하십시오.

내가 지금까지

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId 
    Return x)[0] 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
     FILTER CONTAINS(node.label, @search) 
     AND node != source 
     AND (CONTAINS (path.vertices[*].label, "Person") OR CONTAINS (path.vertices[*].label, "Organization") OR CONTAINS (path.vertices[*].label, "Incident")) 
     LIMIT @maxPaths 
     RETURN {node,path} 

문제

  1. 필터가 모든 노드에를 가지고 무엇 통로. 원본 및 대상없이 경로를 필터링하고 싶습니다.
  2. 들어있는 부분이 너무 추합니다. 여러 값을 필터링하는 더 좋은 방법이 있습니까?

답변

1

1) path.vertices[* LIMIT 1,LENGTH(path.vertices)-2]을 사용하면 정점 배열에서 첫 번째 항목 (소스)과 마지막 항목 (대상)을 무시합니다.

2) 하위 쿼리에서 검색된 레이블을 반복하여 경로의 정점에 있는지 확인할 수 있습니다. 길이가 1 인 배열을 반환하는 LIMIT 1 RETURN 1을 사용하여 하위 쿼리를 종료하면 길이가 1 인 배열이 생깁니다. 그런 다음이 길이로 필터링 할 수 있습니다.

LET labels = ["Person","Organization","Incident"] 

FOR source IN Entity FILTER source.objectID == @nodeId 
LIMIT 1 
FOR node, edge, path IN [email protected] ANY source GRAPH @graph 
    FILTER CONTAINS(node.label, @search) 
    AND node != source 
    AND LENGTH(FOR i IN labels 
    FILTER CONTAINS(path.vertices[* LIMIT 1,LENGTH(path.vertices)-2].label, i) 
    LIMIT 1 
    RETURN 1) == 1 
    LIMIT @maxPaths 
    RETURN {node,path} 

노드 : 나는 바인드 매개 변수로 labels을 사용합니다. 따라서 쿼리를 변경하지 않고 레이블 논리를 확장 할 수 있습니다.