2015-01-15 3 views
1

neo4j에서 내부 ID를 사용하지 말아야한다는 것을 알고 있지만 neo4j 노드의 내부 ID에 액세스하는 방법과이 내부 ID를 기반으로 모든 노드를 반환하는 방법이 있습니까?neo4j 노드의 내부 ID에 액세스하는 방법은 무엇입니까?

  match (n) where id(n)=123 return n; 

이 내부 ID로 나에게 노드를 반환 = 123 만 어떻게 내부 ID를 기준으로 모든 노드가 데이터베이스에 존재 얻을 수 있습니다 :

나는이 시도?

답변

4

는 다음을 상상해 :

CREATE (:SomeLabel {myId:123})-[:someRelationshipType]->(:SomeLabel {myId:456}) 

이 그들 사이의 관계를 가진 두 개의 노드를 작성합니다. 관계는 someRelationshipType입니다.

그럼 다음 쿼리를 실행하면 어떻게됩니까?

ID(root) | root.myId | LABELS(root) | ID(rel) | TYPE(rel)   | ID(target) | target.myId 
----------------------------------------------------------------------------------------------- 
192  | 123  | SomeLabel | 271  | someRelationshipType | 193  | 456 

이 몇 가지 흥미로운 것들을 보여줍니다

MATCH 
    (s:SomeLabel)-[rel:someRelationshipType]->(target:SomeLabel) 
RETURN 
    ID(s),  // Built-in Neo4j function to retrieve the internal node id 
    s.myId,  // Access the property myId that you created above 
    LABELS(s), // Lists all labels for the start node 
    ID(rel),  // Built-in Neo4j function to retrieve the internal relationship id 
    TYPE(rel), // Built-in Neo4j function to retrieve the relationship type 
    ID(target), // Built-in Neo4j function to retrieve the internal node id 
    target.myId // Access the property myId that you created above 

쿼리의 출력은 무엇인가 같다. 먼저 자신이 제공하지 않은 값을 반환하는 몇 가지 기본 제공 함수가 있습니다. ID() 함수는 노드의 내부 ID 또는 관계을 반환합니다. 이것은 생성 된 ID로 자신을 제어 할 수 없으며 데이터베이스에 의해 완전히 처리됩니다 (재사용 할 수도 있으므로 실제로 이러한 값에 의존 할 수는 없습니다). 각 노드는 정확히 하나의 내부 ID을 가지며 전체 데이터베이스에서 고유하므로 동일한 내부 ID를 가진 다중 노드를 찾을 수 없습니다.

위의 쿼리에는 myId이라는 속성도 있습니다. 실제로 우리가 만든 속성이기 때문에 그 속성에 대해 동일한 값을 갖는 다중 노드가있을 수 있습니다. 이러한 속성에 고유 한 값이 포함되어 있는지 확인하는 유일한 방법은 UNIQUE- 제약 (see the docs here)을 사용하는 것입니다. 모든 labels의 목록을 반환 -

  • LABELS :

    CREATE CONSTRAINT ON (n:SomeLabel) ASSERT n.myId IS UNIQUE 
    

    원래 MATCH - 쿼리의 일부 다른 기능은 다음과 같습니다

    고유 제한 조건이 구문을 사용하여 설정할 수 있습니다 노드의 일부

  • TYPE - 노드를 만들 때 지정된 관계 유형을 반환합니다.당신은 다음과 같은 쿼리를 사용할 수 있습니다 그래프에 모든 노드를 잡아하려는 경우

마지막 메모 :

MATCH (n) RETURN n; 

을하지만, 조심 - 그것은 가장 가능성이 고통스러운 것입니다/그래프가 클 경우 모든 노드를 검색하는 데 비용이 많이 드는 작업입니다.

+0

고맙습니다. 굉장히 유용하다! – user1919

+1

@dkar, 문제 없음 - 도움이된다면 기쁘게 생각합니다! – wassgren

1

주어진 내부 ID가있는 노드는 한 번에 하나만있을 수 있습니다. 노드를 삭제 한 후에는 내부 ID를 새 노드로 재 할당 할 수 있지만 이전에는 재 할당 할 수 없습니다.

따라서 쿼리는 최대 하나의 결과 만 반환 할 수 있습니다.

+0

확인. 하지만 내가 원하는 것은 : RETURN DISTINCT (n.internalID)를 만드는 것이다. 다른 속성이 없으므로 데이터에 사용하려면이 기능이 필요합니다. – user1919

+2

이해가 안됩니다. 내부 ID는 DB에 의해 할당되며 ID() 함수를 통해 노드에서 가져 오는 유일한 방법입니다. 물론 노드에 자신의'id' 속성을 추가 할 수는 있지만 내부 ID와 동일하지는 않습니다. 내부 ID를 명시 적으로 설정할 방법이 없습니다. 이렇게해도 문제가 해결되지 않으면 상황에 대한 자세한 정보를 제공해주십시오. – cybersam

+1

아마도 OP가 데이터베이스의 내부 ID **가 노드 속성 **이 아니라는 것을 이해해야한다는 혼란이있을 것입니다. 그래서 당신은'n.internalID' 또는 비슷한 것을 말할 수 없습니다. 대신, 그것을 얻기 위해 당신은'ID()'함수를 사용한다. – FrobberOfBits

관련 문제