You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从.NET访问Azure Digital Twin批量获取节点特定关系数量?

解决Azure Digital Twin批量统计节点特定关系数量的问题

需求说明

需要统计多个Person节点各自拥有的Friend类型关系数量,最终输出节点名称与对应关系数的列表(如John,3;Harry,2)。

问题分析

直接使用IN配合COUNT()会返回所有匹配关系的总数,而非单个节点的关系数。例如原查询:

SELECT Count() AS what FROM DIGITALTWINS twin JOIN parent RELATED twin.HasDocument WHERE twin.$dtId IN ['John', 'Harry']

只会得到John和Harry的HasDocument关系总数,无法区分每个节点的数量。

解决方案

1. 正确的ADT查询语句

使用GROUP BY按节点$dtId分组,结合COUNT()统计每组的关系数量:

SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount
FROM DIGITALTWINS twin
JOIN parent RELATED twin.Friend
WHERE twin.$dtId IN ['John', 'Harry']
GROUP BY twin.$dtId

如果需要统计所有Person类型节点的关系数量,可替换WHERE条件为模型过滤:

SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount
FROM DIGITALTWINS twin
JOIN parent RELATED twin.Friend
WHERE IS_OF_MODEL(twin, 'dtmi:your:model:Person;1')
GROUP BY twin.$dtId

2. C# 代码实现

通过DigitalTwinsClient执行查询,遍历结果并解析为节点名称与关系数的列表:

using Azure.DigitalTwins.Core;
using Azure.Identity;
using System.Collections.Generic;
using System.Text.Json;

// 初始化DigitalTwinsClient(替换为你的ADT端点和凭据)
string adtEndpoint = "https://your-adt-instance.api.wcus.digitaltwins.azure.net";
var credentials = new DefaultAzureCredential();
var client = new DigitalTwinsClient(new Uri(adtEndpoint), credentials);

// 构造查询语句
string query = @"SELECT twin.$dtId AS NodeName, COUNT(parent) AS RelationCount 
                 FROM DIGITALTWINS twin 
                 JOIN parent RELATED twin.Friend 
                 WHERE twin.$dtId IN ['John', 'Harry'] 
                 GROUP BY twin.$dtId";

// 执行查询
AsyncPageable<JsonElement> queryResult = client.QueryAsync(query);

// 存储结果的列表
var relationCountList = new List<(string NodeName, int RelationCount)>();

// 遍历查询结果
await foreach (JsonElement result in queryResult)
{
    string nodeName = result.GetProperty("NodeName").GetString();
    int count = result.GetProperty("RelationCount").GetInt32();
    relationCountList.Add((nodeName, count));
}

// 示例:输出结果
foreach (var item in relationCountList)
{
    Console.WriteLine($"{item.NodeName}, {item.RelationCount}");
}

关键说明

  • 必须使用GROUP BY twin.$dtId将结果按节点分组,才能得到每个节点的独立统计值。
  • 查询返回的是自定义结构(包含NodeName和RelationCount),因此需要用JsonElement解析,而非直接映射到BasicDigitalTwin。

内容的提问来源于stack exchange,提问作者Babnik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:02:08