我希望通过使用rdflib.Dataset或ds.parse(...)将数据解析为默认的图形。当我试图序列化到application/trig或application/n-quads时,我可以看到默认的图三元组位于一个空节点下面。
有没有办法强制使用ds.add(...)或ds.parse(...)添加的三元组在默认图形下?
示例:
from rdflib import Dataset
from rdflib.term import URIRef
ds = Dataset()
# Parse into Default Graph.
ds.parse(data='<df:s> <df:p> <df:o>.')
# Parse into Named Graph '<ng:g>'.
g = ds.graph(URIRef('ng:g'))
g.parse(data='<ng:s> <ng:p> <ng:o>.')
ds_nquads = ds.serialize(format='nquads')
print(ds_nquads)输出:
<ng:s> <ng:p> <ng:o> <ng:g> .
<df:s> <df:p> <df:o> _:Nbd6d6df5e4cb4348980c2d6ff511d6ce .发布于 2022-06-21 23:30:42
g.add()为Graph,g添加了三倍,但是d.add()可以向Dataset,d添加四元,所以您当然可以使用add((subject, predicate, object, graph)),参见数据集文档。
还可以尝试Dataset示例文件,它的大部分数据集操作都显示在其中:https://github.com/RDFLib/rdflib/blob/master/examples/datasets.py
发布于 2022-07-14 21:59:42
我认为问题可能在于parse()如何与Dataset协同工作。三元组似乎不像人们所期望的那样进入Dataset中的默认图,而是进入由空白节点标识的图中。
至于解决方法,如果使用Dataset.add(),用三元组而不是四值调用它,它们将进入默认图,从这里的trig输出可以看到:
示例1(添加,带有trig输出):
from rdflib import Dataset
from rdflib.term import URIRef
ds = Dataset()
# Add into Default Graph.
ds.add((URIRef('df:s'), URIRef('df:p'), URIRef('df:o')))
# Add into Named Graph '<ng:g>'.
g = ds.graph(URIRef('ng:g'))
g.add((URIRef('ng:s'), URIRef('ng:p'), URIRef('ng:o')))
ds_trig = ds.serialize(format='trig')
print(ds_trig)产出1:
@prefix ns1: <ng:> .
@prefix ns2: <urn:x-rdflib:> .
@prefix ns3: <df:> .
ns1:g {
ns1:s ns1:p ns1:o .
}
{
ns3:s ns3:p ns3:o .
}但是,n-quad序列化可能还有另一个问题,因为它似乎没有从输出中省略默认的图形标签,而是显示默认图形的rdflib Dataset内部URI。(上面的trig序列化忽略了它,但是在它输出的命名空间绑定中可以看到它的踪迹。)
示例2 (add,具有n个四元输出):
from rdflib import Dataset
from rdflib.term import URIRef
ds = Dataset()
# Add into Default Graph.
ds.add((URIRef('df:s'), URIRef('df:p'), URIRef('df:o')))
# Add into Named Graph '<ng:g>'.
g = ds.graph(URIRef('ng:g'))
g.add((URIRef('ng:s'), URIRef('ng:p'), URIRef('ng:o')))
ds_nquads = ds.serialize(format='nquads')
print(ds_nquads)产出2:
<df:s> <df:p> <df:o> <urn:x-rdflib:default> .
<ng:s> <ng:p> <ng:o> <ng:g> .用rdflib 6.1.1进行了测试。
https://stackoverflow.com/questions/72480401
复制相似问题