如何在C#代码中从am gremlinquery获取单个值

时间:2019-03-14 07:49:46

标签: azure gremlin

我正在将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,还是唯一可以使用输出和字符串操作的可能性?

2 个答案:

答案 0 :(得分:0)

由于您的输出数据为json格式,因此您可以使用Newtonsoft.Json来读取数据。

我用您的数据创建了一个json文件,您可以只解析json数据而无需文件。只需阅读idproperties.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(); 
    }

结果如下:

enter image description here

希望这可以为您提供帮助,如果您还有其他问题,请告诉我。

更新:如果要获取数组中的值,则可以使用它来获取值:

 Console.WriteLine("mimeType.value:" + jsonData["properties"]["mimeType"][0]["value"].ToString());

enter image description here

答案 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}}。