Neo4J는 ID로 노드 가져 오기


84

내 프로젝트 중 하나에 neo4j를 사용하고 있습니다. 단일 속성 만있는 노드가 있습니다. nameID를 사용하여 해당 노드를 얻고 싶습니다. 이미 ID가 있지만이 코드를 사용할 때

MATCH (s:SKILLS{ID:65110}) return s

아무것도 반환하지 않습니다. 여기에 내 노드가 있습니다.

여기에 이미지 설명 입력

쿼리가 잘못된 경우 번호를 사용하여 쿼리하는 방법


어떤 그래프 시각화 도구를 사용하십니까? 감사. 나는 yworks.com/neo4j-explorer 사용자 정의를위한 좋은 옵션을 알고 있습니다.
MyUserInStackOverflow

답변:


136
MATCH (s)
WHERE ID(s) = 65110
RETURN s

ID함수 는 노드 또는 관계의 ID를 가져옵니다. 이것은 호출 id되거나 ID사용자가 만든 속성과 다릅니다 .


1
(s : SomeLabel {id : 65110})과 같은 데이터를 얻는 다른 방법이 있습니까?
DonkeyKong 2015 년

@DonkeyKong 아니요, id 속성이 아닌 다른 속성을 추가 할 수도 있기 때문입니다. id 속성은 모든 유형을 가질 수 있지만 노드 또는 에지 ID는 Neo4J의 내부 구조 내 위치에 연결된 부호없는 정수입니다.
pvoosten 2015

25
표준 고지 사항 : 장기 엔티티 식별을 위해 내부 Neo4j ID를 사용하지 마십시오. Neo4j의 향후 버전은 성능을 위해 이러한 ID를 이동할 수 있습니다. CONSTRAINT엔티티 추적을위한 고유 한 ID 속성 (이상적으로는 ) 만들기
Brian Underwood

누군가가 관심이 있다면 공식 사이퍼의 문서 단락을 추가 : neo4j.com/docs/cypher-manual/current/clauses/match/...
Ziemowit Stolarczyk

13

경고 : 다음 답변이 잘못되었습니다! START는 레거시 인덱스에 액세스 할 때만 사용해야합니다 . Cypher 2.2 이상 에서는 비활성화되어 있습니다.

Neo4j는를 사용할 것을 권장WHERE ID(n) = 하며, 또한 단일 조회 만 필요 하다고 명시합니다 (일치하는 ID를 찾기 위해 모든 노드를 스캔하지 않음).

다른 사람이 같은 실수를하지 않도록이 답변을 유지합니다.

당신은 할 수 있습니다 사용 WHERE ID(s) = 65110하지만,이 데이터베이스에있는 모든 노드의 ID를 확인합니다.

이를 수행하는 더 효율적인 방법이 있습니다.

START s=NODE(517) MATCH(s) RETURN s

간단한 쿼리에 대한 EXPLAIN 및 PROFILE의 결과는 @Code가 옳다는 것을 보여주었습니다. 문서에없는 이유는 무엇입니까?
Sonata

@Sonata 어떤 버전을 사용하고 있습니까? Neo4j의 최신 버전은 START를 쓸모 없게 만들어야합니다.
Codebling

3.0.7. Result Details콘솔에서 다음 예제를 살펴보십시오 . console.neo4j.org/r/dbz1we(AllNodesScan 수행) 및 console.neo4j.org/r/9076wd(NodeById 수행)
Sonata

@Sonata 왜 이런 일이 일어나는지 잘 모르겠습니다. 우선, 작동하지 않아야합니다. 문서에 따르면 START는 Cypher 2.0에서 더 이상 사용되지 않고 Cypher 2.2부터 비활성화되었지만 여전히 작동 중입니다. 둘째, ID가있는 MATCH는 +NodeByIdSeek1 개의 노드에만 액세스 해야 하지만 어떤 이유로 +AllNodesScan.
Codebling

4

다음과 같이 말할 수 있습니다.

(n:User) where id(n) >=20 RETURN n

그러면 노드 참조 ID가 20 이상인 사용자 유형의 모든 노드가 반환됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.