dotNetRDF v3中INode/IUriNode的Graph属性消失,如何获取所属图?
dotNetRDF v3 替代 INode/IUriNode.Graph 属性的方案
问题描述
我在RDF项目中大量使用INode/IUriNode的Graph属性,但dotNetRDF v3版本中该属性似乎已被移除。此前我通过myUriNode.Graph获取节点所属的图,请问在v3中该如何实现此功能?
编辑:以下是我使用Graph属性的示例(用于获取所有rdf:type类型):
public static IEnumerable<IUriNode> Types(this IUriNode uriNode) { foreach (Triple t in uriNode.Graph.GetTriplesWithSubjectPredicate(uriNode, uriNode.Graph.CreateUriNode("rdf:type"))) if (t.Object is IUriNode uriNodeType) worklist.Add(uriNodeType); }我在项目中经常使用这类Graph.GetTriples...、Graph.CreateUriNode等构造。
解决方案
在dotNetRDF v3中,INode/IUriNode的Graph属性被移除,官方替换为**Owner属性**,它返回IGraph类型,完全兼容原Graph属性的功能。
示例代码修改
针对你给出的类型查询方法,修改后如下:
public static IEnumerable<IUriNode> Types(this IUriNode uriNode) { var graph = uriNode.Owner; // 空值判断,避免节点未关联图时抛出异常 if (graph == null) yield break; var rdfTypeNode = graph.CreateUriNode("rdf:type"); foreach (Triple t in graph.GetTriplesWithSubjectPredicate(uriNode, rdfTypeNode)) { if (t.Object is IUriNode uriNodeType) { worklist.Add(uriNodeType); } } // 补充返回逻辑,原代码遗漏返回值 foreach (var node in worklist) { yield return node; } }
通用适配规则
所有原node.Graph的调用场景,直接替换为node.Owner即可:
- 原
node.Graph.GetTriplesXXX()→ 改为node.Owner.GetTriplesXXX() - 原
node.Graph.CreateUriNode()→ 改为node.Owner.CreateUriNode()
注意事项
如果节点是手动创建但未添加到任何图中的实例,Owner会返回null,建议在使用前添加空值判断,避免空引用异常。
内容的提问来源于stack exchange,提问作者Aaginor
相关产品推荐
相关产品推荐

