2017-12-22 3 views
1

저는 Neo4j를 처음 사용하며 소규모 사이트를 개발 중입니다.shortestPath 관계가 올바른 방향을 반영하지 않습니다.

노드와 노드 간의 관계를 설정했습니다. 쌍을 이루는 노드의 대부분은 상호 링크를 만들었습니다. 예를 들어 :

MATCH (o1 { name: 'Apollo' }),(o2 { name: 'Zeus' }), p = shortestPath((o1)-[*..6]-(o2)) RETURN nodes(p), relationships(p) 

결과는 대신 "아들"의 "아버지"를 반환한다는 것입니다 :

Zeus - FATHER -> Apollo 
Appollo - SON -> Zeus 

나는이 두 가지 사이의 가능한 최단 경로를 찾는 shortestPath을 사용했다.

쿼리를 [*..6]->(o2)으로 변경하면 "SON"이 반환됩니다.

그러나 검색을 통해 나가는 관계가없는 노드가 o1 인 경우 위의 수정 된 쿼리가 실패하는 것으로 간주해야합니다.

그래서 :

  1. 원래 쿼리가 더 나가는 관계 노드에 대처할 수 있지만, 잘못된 관계를 반환 할 수 있습니다.
  2. 수정 된 쿼리는 올바른 관계를 (지금까지) 반환 할 수 있지만 "관계 없음"노드를 처리 할 수 ​​없습니다.

물론 2 호 문제를 해결하기 위해 모든 노드를 변경할 수 있지만 너무 복잡합니다.

귀하의 조언을 얻기를 바랍니다.

답변

1

양방향 관계를 생성하는 것은 나쁜 습관입니다. 특별히 양분 때입니다.

당신은 (그것을 ZeusApollo의 아버지 인 경우, ApolloZeus의 아들임을 분명) 데이터베이스에서 일부 데이터를 복제한다.

이 쿼리 :

MATCH 
    (o1 { name: 'Apollo' }), 
    (o2 { name: 'Zeus' }), 
    p = shortestPath((o1)-[*..6]-(o2)) 
RETURN nodes(p), relationships(p) 

에서만 검색 하나 shortestpath. 그러나 중복으로 인해 실제로는 두 개의 개의 최단 경로가 있습니다. shortestpath 함수를 allshortestpaths으로 대체하면 모두 찾을 수 있습니다. 따라서 당신은 sonfather 결과를가집니다.

또는 당신은 또한 shortestpath 기능으로는 다음과 같이 통과 할 수 thath 관계 유형의 목록을 제공 할 수 있습니다 : 답장을 보내

MATCH 
    (o1 { name: 'Apollo' }), 
    (o2 { name: 'Zeus' }), 
    p = shortestPath((o1)-[:FATHER*..6]-(o2)) 
RETURN nodes(p), relationships(p) 
+0

감사하지만 A가의 아버지입니다 경우 때문에 나는 당신의 점에 동의하지 않았다 B, B는 A의 SON 또는 DAUGHTER가 될 수 있습니다. 또는 A가 B의 SON이면 B는 A의 아버지 또는 어머니가 될 수 있습니다. 이러한 종류의 관계는 오직 한 방향이며, 당신은 상호 관계 유형이 무엇인지를 유도 할 수 없습니다. – TaylorR

+0

rel 유형 'PARENT_OF'를 가질 수 있으며 각 노드에서 성별을 지정할 수 있습니다. – logisima

+0

이렇게하면 Neo4j가 손상됩니다. Neo4j가 가장 좋은 "링크"를 빠르고 직접 검색하는 대신 추가 속성을 검색해야합니다. 나는 그것이 좋은 생각이라고 생각하지 않는다. – TaylorR

관련 문제