2012-12-25 5 views
1

gremlin 쿼리를 작성하는 중 이상한 결과가 나타납니다. "() .has ('name', 'VerisignCzagExtension'). property ('id')"와 같은 대부분의 속성에 대해 has 함수를 사용하면 v5086이 반환됩니다. 하지만 has 속성을 사용하여 has 함수를 사용하려고하면 결코 true를 반환하지 않습니다. 예 : "() .has ('id', 'v5086'). 속성 ('id')"은 결과를 반환하지 않습니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?gremlin에서 ID라는 속성을 얻는 방법

감사합니다.

+0

사용중인 데이터 저장소 (Neo4j, OrientDb, TinkerGraph 등)에 더 자세한 정보를 제공 할 수 있습니까? AFAIK,'id'는 예약 된 속성이며 일반적으로 숫자입니다. 'id'가 각 노드/에지 추가로 자동 ​​증가되는 기존의'id' 속성과 충돌하지 않습니까? – rhetonik

+0

Neo4j 1.8을 사용하고 있고 사이퍼 쿼리 내에서 id 속성을 사용 했으므로 Neo4j의 항목과 충돌하지 않는다고 가정합니다. gremlin이 사용하는 id와 충돌하는지는 잘 모르겠지만. 그것이 흥미로운 부분이라면 그 속성을 요구할 때 여전히 내가 제공 한 가치를 제공한다는 것입니다. 더 나은 질문은 속성 함수에서 올바른 값을 반환한다고 가정하면 속성에서 반환 한 값을 사용하는 비슷한 함수가 있습니까? – user1690293

답변

2

내부적으로 Neo4j는 모든 ID를 java.lang.Long 개체로 저장합니다. 이것은 id 속성에 대해서만 특별한 동작입니다. 다른 모든 속성은 함축 된 데이터 형식과 함께 저장됩니다. 이것이 has('name', 'VerisignCzagExtension')이 작동하는 이유입니다 () name 속성은 id에 해당하는 특수한 동작에서 제외 되었기 때문입니다. 나는 v5086java.lang.Long으로 형 변환되고 있다고 가정하고있어 실제 값을 잃어 버렸습니다. 그것은 has('id', 'v5086') Gremlin 단계 후에 0 결과를 설명 할 수 있습니다.

AFAIK, id 속성을 변경할 수 없습니다 (은 변경할 수 없습니다.). has Gremlin 단계를 사용하여 id을 정점을 찾아야하는 경우 과 같을 것입니다. 정점 id5086이고 java.lang.Long 값으로 저장되어 있다고 가정합니다. L은 명시 적으로 java.lang.Long 타입 캐스팅을위한 것이고, Neo4j는 L을 추가하지 않으면 Neop4j가 java.lang.Integer이라고 가정하고 Gremlin 단계는 결과가 0이됩니다.

마지막으로, name 키가있는 속성처럼 이름이 지정된 ID를 다른 것으로 호출 할 수 있습니다.

희망이 도움이됩니다.

+0

고맙습니다. – user1690293

관련 문제