Получить все вершины с меткой
Я использую график IBM в Bluemix и новичок в этом.
Я создал график с именем "test", используя графический интерфейс, предоставленный bluemix, и загрузил в этот пример образцы данных "Music Festival", предоставленные ibm.
Сейчас я пытаюсь запросить все вершины, имеющие метку "участник", используя запрос ниже.
def gt = graph.traversal();
gt.V().hasLabel("attendee");
Но я получаю ошибку как
Error: Error encountered evaluating script def gt = graph.traversal();gt.V().hasLabel("attendee"); with reason com.thinkaurelius.titan.core.TitanException: Could not find a suitable index to answer graph query and graph scans are disabled: [(~label = attendee)]:VERTEX
Не уверен, что я делаю не так.
Может кто-нибудь сказать, где я иду не так?
Как я могу избавиться от этой ошибки и получить ожидаемый результат?
Спасибо
1 ответ
@Radhika, Ваш запрос Gremlin является действительным запросом Gremlin. Однако некоторые поставщики (например, IBM Graph и Titan) решили разрешить пользователям запускать свои запросы только с индексируемым запросом. Это сделано для того, чтобы обеспечить производительность ваших запросов. призвание hasLabel()
само по себе даст вам Could not find a suitable index...
ошибка, поскольку вы не можете создавать индексы для меток. Что вам нужно сделать, это выполнить этот шаг с шагом, который использует индексированное свойство, как в этом запросе:
graph.traversal();gt.V().hasLabel("band").has("genre","pop");
Индекс для genre
был создан в схеме для данных примера музыкального фестиваля, как вы можете видеть ниже
{
"propertyKeys": [
{ "name": "name", "dataType": "String", "cardinality": "SINGLE" },
{ "name": "gender", "dataType": "String", "cardinality": "SINGLE" },
{ "name": "age", "dataType": "Integer", "cardinality": "SINGLE" },
{ "name": "genre", "dataType": "String", "cardinality": "SINGLE" },
{ "name": "monthly_listeners", "dataType": "String", "cardinality": "SINGLE" },
{ "name":"date","dataType":"String","cardinality":"SINGLE" },
{ "name":"time","dataType":"String","cardinality":"SINGLE" }
],
"vertexLabels": [
{ "name": "attendee" },
{ "name": "band" },
{ "name": "venue" }
],
"edgeLabels": [
{ "name": "bought_ticket", "multiplicity": "MULTI" },
{ "name":"advertised_to","multiplicity":"MULTI" },
{ "name":"performing_at","multiplicity":"MULTI" }
],
"vertexIndexes": [
{ "name": "vByName", "propertyKeys": ["name"], "composite": true, "unique": false },
{ "name": "vByGender", "propertyKeys": ["gender"], "composite": true, "unique": false },
{ "name": "vByGenre", "propertyKeys": ["genre"], "composite": true, "unique": false}
],
"edgeIndexes" :[
{ "name": "eByBoughtTicket", "propertyKeys": ["time"], "composite": true, "unique": false }
]
Вот почему вышеуказанный запрос работает, и вам нужно сделать то же самое.
Если у вас нет схемы, создайте ее. Вы можете смоделировать его после приведенного выше или следовать API документации
Создайте индекс (Vertex/Label) для свойств, с которых вы начнете свои обходы. В этом примере
Name, Gender and Genre
для свойств вершин иname
для свойств края.Вызовите конечную точку схемы, чтобы добавить свою схему на график.
Рекомендуется создать вашу схему перед добавлением каких-либо данных на график, чтобы вам не пришлось переиндексировать позже. Это сэкономит вам много времени.
Как только вы создадите свою схему, вы не сможете изменить то, что вы уже создали, но позже вы сможете добавить новые свойства / индексы.
Посмотрите на следующие примеры кода для Java и Nodejs для точного кода для использования.
Надеюсь, это поможет