#azure #gremlin
#azure #gremlin
Вопрос:
Я использую gremlin с Azure Cosmos DB. Я использую этот код для получения списка файлов из базы данных graph.
public async Task<List<string>> GetFilesWithMoreThanOneFilename()
{
List<string> list = new List<string>();
using (var gremlinClient = new GremlinClient(gremlinServer, new GraphSON2Reader(), new GraphSON2Writer(), GremlinClient.GraphSON2MimeType))
{
var resultSet = await gremlinClient.SubmitAsync<dynamic>("g.V().hasLabel('file').where(out().count().is(gt(1)))");
if (resultSet.Count > 0)
{
foreach (var result in resultSet)
{
string output = JsonConvert.SerializeObject(result);
list.Add(output);
}
}
}
return list;
}
Выходная строка выглядит следующим образом:
{"id":"0a37e4896b6310b6d152f6cf89336173ffb89b819f7955494322e0f0bec017b4","label":"file","type":"vertex","properties":{"fileSize":[{"id":"456b087c-7cf3-43ea-a482-0f31219bc520","value":"41096"}],"mimeType":[{"id":"d849b065-16f8-465b-986c-f8e0fdda9ac7","value":"text/plain"}]}}
Мой вопрос в том, как я могу получить одно значение из результата. Например, только идентификатор или mimeType или это единственная возможность работать с выводом и манипулированием строками?
Ответ №1:
Из-за того, что ваши выходные данные находятся в формате json, вы могли бы использовать Newtonsoft.Json
для чтения данных.
Я создаю файл json с вашими данными, вы могли бы просто проанализировать данные json без файла. И просто прочитайте id
и properties.fileSize
static void Main(string[] args)
{
JObject jsonData = JObject.Parse(File.ReadAllText( "test.json"));
Console.WriteLine("id:" jsonData["id"].ToString());
Console.WriteLine("properties:" jsonData["properties"]["fileSize"].ToString());
Console.ReadLine();
}
И вот результат:
Надеюсь, это может вам помочь, если у вас все еще есть другие вопросы, пожалуйста, дайте мне знать.
Обновление: если вы хотите получить значение в массиве, вы могли бы использовать это для получения значения:
Console.WriteLine("mimeType.value:" jsonData["properties"]["mimeType"][0]["value"].ToString());
Комментарии:
1. Большое вам спасибо. У меня есть еще один вопрос. Как я могу просто получить значение filesize? Я имею в виду только 41096 без идентификатора и «значения» перед ним?
2. @Christopher H. , если это сработает, пожалуйста, отметьте это как ответ. Спасибо!
3. @Christopher H. , ты не знал, как отметить ответ? Слева от моего ответа есть возможность отметить.
Ответ №2:
В общем, вы должны извлекать только те значения, которые вам действительно нужны, а не вершины со всеми их свойствами, а затем фильтровать локально. Это эквивалентно реляционным базам данных, где вы обычно этого не делаете SELECT *
и вместо этого делаете что-то вроде SELECT name
.
Кроме того, вы должны указать ожидаемый тип возвращаемого значения, который разрешает Gremlin.Используйте NET для десериализации результата для вас, чтобы вам не приходилось делать это самостоятельно.
Эти два предложения вместе дают вам что-то вроде этого:
var names = await client.SubmitAsync<string>(
"g.V().hasLabel('person').where(out().count().is(gt(1))).values('name')");
Console.WriteLine($"First name: {names.First()}");
names
тогда это просто ResultSet<string>
который реализует IReadOnlyCollection<string>
.