Непоследовательная обработка значений свойств в JanusGraph - PullRequest
0 голосов
/ 11 мая 2018

Получение некоторых проблем во время игры с JanusGraph.Я новичок в JanusGraph, недавно я установил и следовал за документацией для добавления вершины с ее свойствами и еще немного, но когда я пытаюсь вставить свойство с плавающей запятой и установить ключ как "abc", и значение будет 9.5f вв этом случае я получил ошибку, но в том же запросе, когда я меняю ключ на "a" или что-то еще, он отлично работает.

Пример с ключом abc

g.addV("T22").property("abc", 9.5f)

Ошибка

Value [9.5] is not an instance of the expected data type for property key [abc] and cannot be converted. Expected: class java.lang.Integer, found: class java.lang.Float

Пример с ключом a

g.addV("T22").property("a", 9.5f) отлично работает

g.V(163848208).valueMap() {a=[10.5]}

обновлено

enter image description here

Получена та же ошибка, ошибка произошла только с двумя ключами свойств

  1. abc
  2. Mailing_Code

1 Ответ

0 голосов
/ 15 мая 2018

По умолчанию JanusGraph использует автоматический создатель схемы .Когда используется новый ключ свойства, он определяет ключ свойства со своим типом данных на основе значения.В вашем сценарии это звучит как первое использование abc, использованное Integer вместо Float.Вот пример, воссоздающий ваш сценарий:

gremlin> JanusGraph.version()
==>0.2.0
gremlin> graph = JanusGraphFactory.open('inmemory')
==>standardjanusgraph[inmemory:[127.0.0.1]]
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[inmemory:[127.0.0.1]], standard]
gremlin> g.addV("T22").property("abc", 9).iterate()
gremlin> g.tx().commit()
==>null
gremlin> g.addV("T22").property("abc", 9.5f).iterate()
Value [9.5] is not an instance of the expected data type for property key [abc] and cannot be converted. Expected: class java.lang.Integer, found: class java.lang.Float

После того, как ключ свойства определен, его тип данных не может быть изменен.Как описано в документации:

Настоятельно рекомендуется явно определить все элементы схемы и отключить автоматическое создание схемы, установив schema.default=none в конфигурации графа JanusGraph.

Это даст вам лучший контроль над созданной схемой.Вот пример того, как это сделать:

gremlin> graph = JanusGraphFactory.build().
......1>     set('storage.backend', 'inmemory').
......2>     set('schema.default', 'none').
......3>     open()
==>standardjanusgraph[inmemory:[127.0.0.1]]
gremlin> mgmt = graph.openManagement()
==>org.janusgraph.graphdb.database.management.ManagementSystem@46aa712c
gremlin> mgmt.makeVertexLabel('T22').make()
==>T22
gremlin> mgmt.makePropertyKey('abc').dataType(Float.class).make()
==>abc
gremlin> mgmt.commit()
==>null
gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[inmemory:[127.0.0.1]], standard]
gremlin> g.addV('T22').property('abc', 9).iterate()
gremlin> g.tx().commit()
==>null
gremlin> g.addV('T22').property('abc', 9.5f).iterate()
gremlin> g.tx().commit()
==>null
gremlin> g.V().values('abc').map{ [ it.get(), it.get().getClass().getName() ] }
11:29:34 WARN  org.janusgraph.graphdb.transaction.StandardJanusGraphTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
==>[9.5,java.lang.Float]
==>[9.0,java.lang.Float]

Вот ссылка на документацию по схеме JanusGraph, в которой содержится дополнительная информация.

...