如何使用 Python 中的 RDFlib 从字典列表(三元组)中制作多个 RDF 图?
How to make multiple RDF graphs from a list of dictionaries (triples) with RDFlib in Python?
我有: 需要使用 RDFlib 转换为 RDF 的 20k 词典(三元组)的列表。
目标: 对于每个三元组,我想要一个新的 rdf Graph()。但是,当我遍历所有三元组时,方法 .add() 将每个三元组累积到同一个图中。
问题:如何在每次循环时制作一个新的图表,使图表不会在每次循环时累积数据?也许有一种方法可以在每个循环中删除图形?
在实际代码中,我将每个 rdf 转换的三元组发布到一个服务,这需要一个一个地完成,因为它有很多数据(20k 三元组)。对于每个三元组,它都是自己的出版物,所以我不能将它们全部放在同一张图中。
我的示例代码(简体):
import rdflib
from rdflib import Graph, FOAF, Literal, Namespace
list_dicts_triples = [{'subject': 'she', 'predicate': 'went', 'object': 'there'},
{'subject': 'I', 'predicate': 'like', 'object': 'ice-cream'}]
graph = Graph()
EX = Namespace('http://example.org/')
rdf = Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
graph.bind('ex', EX)
subject_rdf = rdf["subject"]
object_rdf = rdf["object"]
predicate_rdf = rdf['predicate']
for triple in list_dicts_triples:
graph.add((subject_rdf, EX.TYPE, FOAF.Person)) #subject
graph.add((predicate_rdf, rdflib.URIRef('http://example_predicates.com'), Literal(triple['predicate']))) #predicate
graph.add((object_rdf, rdflib.URIRef('http://example_concepts.com'), Literal(triple['object']))) #object
output = graph.serialize(format='ttl').decode('u8')
print(output) #print rdf graph
当前输出:(可以看到,第一个字典的条目已经添加到第二个rdf图中('there','went' ..).
#graph 1
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "there" .
rdf:predicate ns1:example_predicates.com "went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
#graph 2
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "ice-cream",
"there" .
rdf:predicate ns1:example_predicates.com "like",
"went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
期望的输出:(这里,每个图表代表列表中的每个唯一 dictionary/triple。
#graph 1
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "there" .
rdf:predicate ns1:example_predicates.com "went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
#graph 2
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "ice-cream".
rdf:predicate ns1:example_predicates.com "like".
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
在上面的代码中,您并没有为每个三元组创建一个新图表。请注意,声明是 在 for 循环之外。将它移到里面,它应该可以按您希望的方式工作。
import rdflib
from rdflib import Graph, FOAF, Literal, Namespace
list_dicts_triples = [{'subject': 'she', 'predicate': 'went', 'object': 'there'},
{'subject': 'I', 'predicate': 'like', 'object': 'ice-cream'}]
EX = Namespace('http://example.org/')
rdf = Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
subject_rdf = rdf["subject"]
object_rdf = rdf["object"]
predicate_rdf = rdf['predicate']
for triple in list_dicts_triples:
graph = Graph()
graph.bind('ex', EX)
graph.add((subject_rdf, EX.TYPE, FOAF.Person)) #subject
graph.add((predicate_rdf, rdflib.URIRef('http://example_predicates.com'), Literal(triple['predicate']))) #predicate
graph.add((object_rdf, rdflib.URIRef('http://example_concepts.com'), Literal(triple['object']))) #object
output = graph.serialize(format='ttl').decode('u8')
print(output) #print rdf graph
我有: 需要使用 RDFlib 转换为 RDF 的 20k 词典(三元组)的列表。
目标: 对于每个三元组,我想要一个新的 rdf Graph()。但是,当我遍历所有三元组时,方法 .add() 将每个三元组累积到同一个图中。
问题:如何在每次循环时制作一个新的图表,使图表不会在每次循环时累积数据?也许有一种方法可以在每个循环中删除图形?
在实际代码中,我将每个 rdf 转换的三元组发布到一个服务,这需要一个一个地完成,因为它有很多数据(20k 三元组)。对于每个三元组,它都是自己的出版物,所以我不能将它们全部放在同一张图中。
我的示例代码(简体):
import rdflib
from rdflib import Graph, FOAF, Literal, Namespace
list_dicts_triples = [{'subject': 'she', 'predicate': 'went', 'object': 'there'},
{'subject': 'I', 'predicate': 'like', 'object': 'ice-cream'}]
graph = Graph()
EX = Namespace('http://example.org/')
rdf = Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
graph.bind('ex', EX)
subject_rdf = rdf["subject"]
object_rdf = rdf["object"]
predicate_rdf = rdf['predicate']
for triple in list_dicts_triples:
graph.add((subject_rdf, EX.TYPE, FOAF.Person)) #subject
graph.add((predicate_rdf, rdflib.URIRef('http://example_predicates.com'), Literal(triple['predicate']))) #predicate
graph.add((object_rdf, rdflib.URIRef('http://example_concepts.com'), Literal(triple['object']))) #object
output = graph.serialize(format='ttl').decode('u8')
print(output) #print rdf graph
当前输出:(可以看到,第一个字典的条目已经添加到第二个rdf图中('there','went' ..).
#graph 1
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "there" .
rdf:predicate ns1:example_predicates.com "went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
#graph 2
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "ice-cream",
"there" .
rdf:predicate ns1:example_predicates.com "like",
"went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
期望的输出:(这里,每个图表代表列表中的每个唯一 dictionary/triple。
#graph 1
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "there" .
rdf:predicate ns1:example_predicates.com "went" .
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
#graph 2
@prefix ex: <http://example.org/> .
@prefix ns1: <http://> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
rdf:object ns1:example_concepts.com "ice-cream".
rdf:predicate ns1:example_predicates.com "like".
rdf:subject ex:TYPE <http://xmlns.com/foaf/0.1/Person> .
在上面的代码中,您并没有为每个三元组创建一个新图表。请注意,声明是 在 for 循环之外。将它移到里面,它应该可以按您希望的方式工作。
import rdflib
from rdflib import Graph, FOAF, Literal, Namespace
list_dicts_triples = [{'subject': 'she', 'predicate': 'went', 'object': 'there'},
{'subject': 'I', 'predicate': 'like', 'object': 'ice-cream'}]
EX = Namespace('http://example.org/')
rdf = Namespace('http://www.w3.org/1999/02/22-rdf-syntax-ns#')
subject_rdf = rdf["subject"]
object_rdf = rdf["object"]
predicate_rdf = rdf['predicate']
for triple in list_dicts_triples:
graph = Graph()
graph.bind('ex', EX)
graph.add((subject_rdf, EX.TYPE, FOAF.Person)) #subject
graph.add((predicate_rdf, rdflib.URIRef('http://example_predicates.com'), Literal(triple['predicate']))) #predicate
graph.add((object_rdf, rdflib.URIRef('http://example_concepts.com'), Literal(triple['object']))) #object
output = graph.serialize(format='ttl').decode('u8')
print(output) #print rdf graph