首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换节点DotnetRDF

替换节点DotnetRDF
EN

Stack Overflow用户
提问于 2015-10-20 08:01:53
回答 2查看 222关注 0票数 1

我正在尝试使用dotNetRDF修改一个Rdf节点,然后将它保存到一个新文件中,但是我得到的是同一个文件!

我想将身份证/12改为身份证/18。

模板文件:

代码语言:javascript
复制
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>.
@prefix owl:  <http://www.w3.org/2002/07/owl#>.
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#>.
@prefix qudt: <http://qudt.org/schema/qudt#>.
@prefix qudt-unit: <http://qudt.org/vocab/unit#>.
@prefix knr: <http://kurl.org/NET/knr#>.

@prefix keak: <http://kurl.org/NET/keak#>.
@prefix keak-time: <http://kurl.org/NET/keak/time#>.
@prefix keak-eval: <http://kurl.org/NET/keak/eval#>.
@prefix keak-quantity: <http://kurl.org/NET/keak/quantity#>.
@prefix keak-ev: <http://kurl.org/NET/keak/ev#>.

@base <http://data.info/keak/knr/>.

<Identification/12> a keak-ev:Identification.

<Quantity/45> a qudt:Quantity ;
  qudt:quantityType keak-quantity:ElectricConsumption .

VB.NET代码:

代码语言:javascript
复制
Dim gKnr As IGraph = New Graph()
Dim ttlParser As TurtleParser = New TurtleParser()

'Load the file template
ttlParser.Load(gKnr, PATH_TEMPLATE)
gKnr.BaseUri = New Uri(keak_BASE_URI_Knr)

Dim oNode As INode = gKnr.CreateUriNode(New Uri("http://kurl.org/NET/keak/ev#Identification"))

'retrieve the item
Dim listRes As List(Of Triple) = gKnr.GetTriplesWithObject(oNode)
'?s = http://data.info/keak/Knr/Identification/12 , 
'?p = http://www.w3.org/1999/02/22-rdf-syntax-ns#type , 
'?o = http://kurl.org/NET/keak/ev#Identification

'modify the item
Dim tIdentification As Triple
If listRes.Count = 1 Then
    tIdentification = listRes(0)
    tIdentification.Subject.GraphUri = New Uri("http://data.info/kseak/knr/Identification/18")

End If

gKnr.Assert(tIdentification)

' Serialisation and Save
Dim ttlWriter As New CompressingTurtleWriter()
ttlWriter.DefaultNamespaces = gKnr.NamespaceMap
ttlWriter.Save(gKnr, PATH_NEW_FILE)
EN

回答 2

Stack Overflow用户

发布于 2015-10-22 09:47:40

这是行不通的,GraphUriINode的一个属性,它指示节点来自哪个图,并且与节点的实际URI无关。

无论如何,INode是不可变的,您不能像您尝试的那样更改节点的URI。

如果希望在RDF图中更改URI,则需要对使用该URI的所有三元组进行Retract(),并使用新的URI和Assert()创建新的三元组。

下面的示例可能在语法上是不正确的VB,但希望它能给您提供大致的想法:

代码语言:javascript
复制
Dim listRes As List(Of Triple) = gKnr.GetTriplesWithObject(oNode).ToList()

For Each origTriple in listRes
  gKnr.Retract(origTriple)
  Dim newTriple as Triple
  newTriple = new Triple(New Uri("http://data.info/kseak/knr/Identification/18"), origTriple.Predicate, origTriple.Object)
  gKnr.Assert(newTriple)
Next

当然,如果您想要更改的URI不仅仅发生在主题位置上,那么您需要适当地更改逻辑。

票数 1
EN

Stack Overflow用户

发布于 2015-10-22 12:38:55

谢谢robV,它帮了我很大的忙,我从视觉上得到了一个例外,但我设法纠正了它,这是最后的代码:

代码语言:javascript
复制
    For Each origTriple In listRes
        gKnr.Retract(origTriple)
        Dim sNode As INode = gKnr.CreateUriNode(UriFactory.Create("http://data.info/keask/Knr/Identification/18"))
        Dim newTriple As Triple
        newTriple = New Triple(sNode, origTriple.Predicate, origTriple.Object)
        gKnr.Assert(newTriple)
    Next
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33231169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档