2013-06-05 3 views
0

그래프에 neo4j가 있고, 주어진 노드 N에 대해 N에서 P 단계 이상 도달 할 수있는 모든 노드와 그 사이의 모든 링크를 찾고 싶습니다. 노드 세트. 이것은 Cypher 또는 Traversal 프레임 워크에서 가능할 수있는 것처럼 보입니다. 하나가 다른 것보다 선호됩니까? 필자는 내장 데이터베이스를 사용하여 Java에서이 작업을 수행하고 있으며 하위 그래프에 대한 추가 쿼리를 수행해야합니다. 나는 주위를 뚫고 결정적인 답을 찾지 못했습니다.neo4j에서 유도 된 부분 그래프

답변

2

나는 사이퍼는 가변 길이 경로에 대한 쿼리, 원하는 데이터를 얻을 수있는 가장 간결한 방법이라고 생각, 일부 수집 및 정제 :

n은 노드 N의 내부 ID가하고 P가 5 인 경우 :

START begin = node(n)    // or e.g. index lookup 
MATCH p = (begin)<-[r*..5]-(end) // match all paths of length up to 5 
WITH distinct nodes(p) as nodes // collect the nodes contained in the paths 
MATCH (x)<-[r]-(y)    // find all relationships between nodes 
WHERE x in nodes and y in nodes // which were found earlier 
RETURN distinct x,r,y    // and deduplicate as you find all pairs twice 

그것은 가장 효율적인 방법이 될 않을 수도 있지만 적어도 http://console.neo4j.org/의 실행 계획 설명은 y in nodesMATCH (x)-[r]-(y) 전에 간주됩니다 제안합니다.

나는 관계를 두 번 일치시키지 않기 위해 return 문에 distinct을 생각할 수 없었다.

+0

감사합니다. 시도해 보겠습니다. 새 내장 데이터베이스를 만들고 그 안에 그래프를 넣는 것이 해당 하위 그래프에 대한 추가 작업을 수행하는 가장 좋은 방법 인 것 같습니다. – betseyb

관련 문제