По умолчанию 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, в которой содержится дополнительная информация.