문제

선택 사항이지만 특정 노드/관계가 있는 노드 간의 관계를 찾으려고 합니다(neo4j 2.0 M6).

내 데이터 모델에서 'Gene'은 '그룹'의 'PARTOF'가 될 수 있습니다.'Gene'-'Gene', 'Gene'-'그룹', '그룹'-'그룹' 사이에 'INTERACT' 관계가 있습니다(모델 이미지의 빨간색 선).

나는 이것을 'Gene' 사이의 모든 'INTERACT' 관계로 요약하고 싶습니다.둘 다 직접 (Gene-INTERACT-Gene) 하나 또는 두 개의 '그룹'을 통해 (Gene-PARTOF-Group-INTERACT-Gene).


enter image description here


물론 이것은 여러 Cypher 쿼리를 사용하면 쉽습니다.

# direct INTERACT
MATCH (g1:Gene)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via one Group
MATCH (g1:Gene)-[:PARTOF]-(gr:Group)-[r:INTERACT]-(g2:Gene) RETURN g1, g2
# INTERACT via two Group
MATCH (g1:Gene)-[:PARTOF]-(gr1:Group)-[r:INTERACT]-(gr2:Group)-[:PARTOF]-(g2:Gene)
RETURN g1, g2

그러나 경로에서 선택적인 '그룹 단계'를 사용하는 단일 Cypher 쿼리를 구성하는 것이 가능합니까?지금까지는 선택적인 관계만 사용했고 shortestPaths, 그러나 두 유전자 사이에서 하나 또는 두 개의 선택적 노드를 필터링할 수 있는지는 잘 모르겠습니다.

도움이 되었습니까?

해결책

경로에 추가하는 각 관계에 대해 0과 1 사이의 깊이를 할당할 수 있습니다.다음과 같은 것을 시도해보세요

MATCH (g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN g1,g2

일치하는 경로가 실제로 어떻게 보이는지 보려면 전체 경로를 반환하면 됩니다.

MATCH p=(g1:Gene)-[:PARTOF*0..1]-(gr1)-[:INTERACT]-(gr2)-[:PARTOF*0..1]-(g2:Gene) 
RETURN p

그러나 이 패턴의 선택적 부분에 대해 노드 레이블을 선언하는 데는 약간의 귀찮은 점이 있으므로 이 쿼리에서는 유전자가 그룹 이외의 다른 것의 일부가 아니며 그룹 및 다른 유전자와만 상호 작용한다고 가정합니다.유전자가 가질 수 있다면 [:PARTOF] 그럼 다른걸로 (gr1) 해당 항목을 바인딩하고 쿼리는 더 이상 신뢰할 수 없습니다.간단히 다음과 같은 where 절을 추가하면 됩니다.

WHERE gr1:Group AND gr2:Group

선택적 부분이 일치하지 않는 경우를 제외하므로 작동하지 않습니다(세 번째 쿼리와 같습니다).문제가 해결될 수 있다고 확신하지만 실제 모델이 질문에 설명된 것보다 훨씬 복잡하지 않다면 이렇게 해야 합니다.

나는 콘솔에서 당신의 모델을 자유롭게 해석했습니다. 여기, 원하는 대로 작동하는지 확인해 보세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top