Как получить атрибут с именем ID в gremlin

Я получаю странные результаты при написании запроса к гремлину. Я с радостью могу использовать функцию has для большинства атрибутов моих узлов, например «() .has ('name', 'VerisignCzagExtension'). Property ('id')» вернет v5086. Но когда я пытаюсь использовать функцию has с идентификатором атрибута, она никогда не возвращает true. например, « () .has ('id', 'v5086'). property ('id')» не возвращает результатов. Кто-нибудь знает, почему это происходит?

Спасибо.


person user1690293    schedule 25.12.2012    source источник
comment
Не могли бы вы предоставить более подробную информацию о хранилище данных, которое вы используете (Neo4j, OrientDb, TinkerGraph и т. Д.) С его версией? AFAIK, id - это зарезервированное свойство, обычно числовое. Вы уверены, что ваш id не конфликтует с существующим свойством id, которое автоматически увеличивается с каждым добавлением узла / ребра?   -  person rhetonik    schedule 26.12.2012
comment
Я использую Neo4j 1.8, и у меня было свойство id в запросах cypher, поэтому я предполагаю, что оно не конфликтует ни с чем в Neo4j. Хотя я понятия не имею, противоречит ли это идентификатору, используемому гремлином. Хотя, если это так, то интересным является то, что он все еще дает мне значения, которые я предоставил, когда я прошу недвижимость. Возможно, лучший вопрос: учитывая, что он возвращает правильное значение из функции свойства, существует ли аналогичная функция, которая бы использовала значение, возвращаемое свойством?   -  person user1690293    schedule 26.12.2012


Ответы (1)


Внутри Neo4j хранит все идентификаторы как java.lang.Long объекты. Это особое поведение только для свойства id. Все остальные свойства хранятся с подразумеваемыми типами данных. По этой причине has('name', 'VerisignCzagExtension') работает (потому, что свойство name исключено из этого особого поведения, предназначенного для id). Я предполагаю, что v5086 набирает тип java.lang.Long, теряя, таким образом, его реальную ценность. Это могло объяснить нулевой результат после has('id', 'v5086') шага Гремлина.

AFAIK, свойство id неизменяемо (не может быть изменено). Если вам нужно id искать вершины с помощью has шага Гремлина, это будет выглядеть примерно как has('id', 5086L) при условии, что вершина id равна 5086 и сохраняется как значение java.lang.Long. Дополнительный L предназначен для явного java.lang.Long приведения типов, Neo4j примет java.lang.Integer, если вы не добавите это L, и ваш шаг Gremlin снова приведет к нулевым результатам.

Наконец, вы можете захотеть назвать свой именованный идентификатор чем-то еще, например, свойством с ключом name.

Надеюсь это поможет.

person rhetonik    schedule 26.12.2012