我正在尝试使用dotNetRDF修改Rdf节点,然后将其保存在新文件中,但我得到相同的文件!!
我想将Identification / 12更改为Identification / 18.
模板文件:
@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代码:
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)
答案 0 :(得分:1)
这不起作用,GraphUri
是INode
的属性,表示节点来自哪个图并且与节点的实际URI无关
无论INode
是不可变的,您都无法像尝试那样更改节点的URI。
如果您希望更改RDF图中的URI,则需要Retract()
使用该URI的所有三元组,并使用新URI和Assert()
创建新的三元组。
以下示例可能是同义错误的VB,但希望它能为您提供一般性的想法:
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 :(得分:0)
谢谢robV,它给了我很多帮助,我从视觉中得到了一个例外,但我设法纠正了它,这是最终的代码:
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