Как пройти без индексированного значения? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть сценарий, который я хочу запросить для получения всех вершин, которые не имеют указанных c ключа свойства и значения. Итак, я попробовал:

g.V().hasLabel('Persona').hasNot('isTempDob').count()

, в результате

Could not find a suitable index to answer graph query and graph scans are disabled: [(~label = Persona)]:VERTEX

Итак, я попробовал более простой, следуя документации, такой как получение количества вершин с именем метки Persona . Запрос

g.V('Persona').count()

привел к

0

Я не знаю, почему я не могу пройти без какого-либо индексированного значения? Любая помощь будет принята с благодарностью. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я тестировал в консоли gremlin docker.

Идентификатор - это уникальный идентификатор для каждой вершины. При создании вершины вы можете указать идентификатор или сгенерировать его автоматически. Например,

gremlin> saturn = g.addV("character").property(T.id, 1).property('name', 'saturn').property('age', 10000).property('type', 'titan').next();
==>v[1]

Если вы создадите вершину описанным выше способом, вы получите v[1] в качестве идентификатора, который вы укажете. Следующее не указывало ID, тогда gremlin сгенерирует его для вас:

gremlin> g.addV("character").property('name',  'prometheus').property('age', 1000).property('type', 'god').next()
==>v[0]

Предположим, что это первая вершина, тогда ее ID будет 0. В вашем сценарии, если вы запрашиваете, все вершины имеют одинаковые пометить и исключить указанное имя, вы можете попробовать это (я использую игрушечный граф JanusGraph боги ):

gremlin> g.V().has('character','name',neq('hercules')).valueMap();
==>[name:[prometheus],type:[god],age:[1000]]
==>[name:[saturn],type:[titan],age:[10000]]
==>[name:[jupiter],type:[god],age:[5000]]
==>[name:[neptune],type:[god],age:[4500]]
==>[name:[alcmene],type:[human],age:[45]]
==>[name:[pluto],type:[god],age:[4000]]
==>[name:[nemean],type:[monster],age:[20]]
==>[name:[hydra],type:[monster],age:[0]]
==>[name:[cerberus],type:[monster],age:[0]]

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

gremlin> g.V().hasLabel('character').has('name',neq('hercules')).valueMap();

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

Дайте мне знать, если это поможет.

0 голосов
/ 25 февраля 2020

Возможно, это просто неверный тип, но g.V('Persona').count() не ищет метки - он ищет вершины с уникальным идентификатором "Persona". В результате я подозреваю, что ответ «0» был правильным.

Я не знаю, почему я не могу пройти без какого-либо индексированного значения?

JanusGraph (и другие графические системы) предотвращают обходы без индексированных значений в качестве ограждения, чтобы предотвратить случайное выполнение пользователями долгосрочных запросов. Если у вас небольшой график с тысячами вершин, вероятно, эта функция вас раздражает, но если у вас есть миллиарды вершин, это может быть отличным помощником, поскольку такой запрос, как тот, который вы написали, будет занимать часы и часы завершить и не будет рекомендуемым подходом, чтобы получить этот ответ. Если вы выполняете глобальное сканирование всех вершин в графике, вам следует выполнить Gremlin над Spark, чтобы использовать возможности параллельной обработки, превращая эти часы и часы в минуты.

Возвращаясь к случаю На небольшом графике вы можете временно отключить ограждение, настроив JanusGraph с помощью query.force-index=false, чтобы разрешить выполнение запроса. Это должно позволить вашему запросу работать без этой ошибки / предупреждения.

...