Поиск мультисвойств на JanusGraph

У меня вопрос о свойствах, мощность которых множественна. Когда я использую свойство со списком или набором мощности, могу ли я выполнять поиск по нему с помощью BerkleyDB? Или его нужно проиндексировать? Также могу ли я выполнять операции NotIn и IN на нем? Например, если мое свойство содержит данные [1,2,3], могу ли я сделать [2] в [1,2,3] или [4] NotIn [1,2,3]


person allthenutsandbolts    schedule 08.03.2018    source источник


Ответы (1)


Вы можете запрашивать свойство списка / набора независимо от выбранного бэкэнда хранилища. Вы должны использовать индекс для повышения производительности, потому что для этого потребуется полное сканирование без индекса графа (вы увидите сообщение WARN). Операция without() также потребует полного сканирования.

gremlin> [ JanusGraph.version(), Gremlin.version() ]
==>0.2.0
==>3.2.6
gremlin> graph = JanusGraphFactory.build().
......1>     set('storage.backend', 'berkeleyje').
......2>     set('storage.directory', '/tmp/berkeleyje').
......3>     open()
==>standardjanusgraph[berkeleyje:/tmp/berkeleyje]

gremlin> mgmt = graph.openManagement()
==>org.janusgraph.graphdb.database.management.ManagementSystem@32b0876c
gremlin> nums = mgmt.makePropertyKey('nums').
......1>     dataType(Integer.class).cardinality(Cardinality.LIST).make()
==>nums
gremlin> numsIdx = mgmt.buildIndex('numsIdx', Vertex.class).
......1>     addKey(nums).buildCompositeIndex()
==>numsIdx
gremlin> mgmt.commit()
==>null

gremlin> g = graph.traversal()
==>graphtraversalsource[standardjanusgraph[berkeleyje:/tmp/berkeleyje], standard]
gremlin> g.addV().
......1>     property(VertexProperty.Cardinality.list, 'nums', 1).
......2>     property(VertexProperty.Cardinality.list, 'nums', 2).
......3>     property(VertexProperty.Cardinality.list, 'nums', 3)
==>v[4136]
gremlin> g.addV().property(VertexProperty.Cardinality.list, 'nums', 4)
==>v[8232]
gremlin> g.V().valueMap(true)
17:53:44 WARN  org.janusgraph.graphdb.transaction.StandardJanusGraphTx  - Query requires iterating over all vertices [()]. For better performance, use indexes
==>[label:vertex,nums:[1,2,3],id:4136]
==>[label:vertex,nums:[4],id:8232]
gremlin> g.V().has('nums', within(2))
==>v[4136]
gremlin> g.V().has('nums', without(4))
17:53:45 WARN  org.janusgraph.graphdb.transaction.StandardJanusGraphTx  - Query requires iterating over all vertices [(nums <> 4)]. For better performance, use indexes
==>v[4136]
person Jason Plurad    schedule 11.03.2018