我正在将gremlin与Azure Cosmos DB一起使用。我正在使用此代码从图形数据库中获取文件列表。
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"}]}}
我的问题是如何从结果中获得单个值。例如,仅ID还是mimeType,还是唯一可以使用输出和字符串操作的可能性?
答案 0 :(得分:0)
由于您的输出数据为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 :(得分:0)
通常,只应检索实际需要的值,而不应检索具有所有属性的顶点,然后在本地进行过滤。这等效于关系数据库,在该数据库中,您通常不会执行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>
的{{1}}。