문제
선택 사항이지만 특정 노드/관계가 있는 노드 간의 관계를 찾으려고 합니다(neo4j 2.0 M6).
내 데이터 모델에서 'Gene'은 '그룹'의 'PARTOF'가 될 수 있습니다.'Gene'-'Gene', 'Gene'-'그룹', '그룹'-'그룹' 사이에 'INTERACT' 관계가 있습니다(모델 이미지의 빨간색 선).
나는 이것을 'Gene' 사이의 모든 'INTERACT' 관계로 요약하고 싶습니다.둘 다 직접 (Gene-INTERACT-Gene)
하나 또는 두 개의 '그룹'을 통해 (Gene-PARTOF-Group-INTERACT-Gene)
.
물론 이것은 여러 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
선택적 부분이 일치하지 않는 경우를 제외하므로 작동하지 않습니다(세 번째 쿼리와 같습니다).문제가 해결될 수 있다고 확신하지만 실제 모델이 질문에 설명된 것보다 훨씬 복잡하지 않다면 이렇게 해야 합니다.
나는 콘솔에서 당신의 모델을 자유롭게 해석했습니다. 여기, 원하는 대로 작동하는지 확인해 보세요.