Python 将字典列表转换为rdf格式
目标:(自动化:当有大量字典时,我想生成一个specic格式的数据) 这是输入:Python 将字典列表转换为rdf格式,python,rdf,Python,Rdf,目标:(自动化:当有大量字典时,我想生成一个specic格式的数据) 这是输入: a = ['et2': 'OBJ Type', 'e2': 'OBJ', 'rel': 'rel', 'et1': 'SUJ Type', 'e1': 'SUJ'}, {'et2': 'OBJ Type 2', 'e2': 'OBJ', 'rel': 'rel', 'et1': 'SUJ Type', 'e1': 'SUJ'} ] 预期输出如下: :Sub a :Su
a = ['et2': 'OBJ Type',
'e2': 'OBJ',
'rel': 'rel',
'et1': 'SUJ Type',
'e1': 'SUJ'},
{'et2': 'OBJ Type 2',
'e2': 'OBJ',
'rel': 'rel',
'et1': 'SUJ Type',
'e1': 'SUJ'}
]
预期输出如下:
:Sub a :SubType.
:Sub :rel "Obj".
这就是我尝试过的
Sub = 0
for i in a:
entity_type1 = i["EntityType1"]
entity1 = i["Entity1"]
entity_type2 = i["EntityType2"]
entity2 = i["Entity2"]
relation = i["Relation"]
if 'Sub' in entity_type1 or entity_type2:
if entity1 == Sub and Sub <= 0 :
Sub +=1
sd_line1 = ""
sd_line2 = ""
sd_line1 = ":" + entity1 + " a " + ":" + entity_type1 + "."
relation = ":"+relation
sd_line2 ="\n" ":" + entity1 + " " + relation + " \"" + entity2 + "\"."
sd_line3 = sd_line1 + sd_line2
print(sd_line3)
Sub=0
对于我来说,在一个:
实体类型1=i[“实体类型1”]
entity1=i[“entity1”]
实体类型2=i[“实体类型2”]
entity2=i[“entity2”]
关系=i[“关系”]
如果实体类型1或实体类型2中的“Sub”:
如果entity1==Sub和Sub一点建议:在执行这种转换工作流时,尝试将主要步骤分开,例如:从系统加载、以一种格式解析数据、提取、转换、序列化为另一种格式、加载到另一个系统
在代码示例中,您混合了提取、转换和序列化步骤。分离这些步骤将使代码更易于阅读,从而更易于维护或重用
下面,我给你两个解决方案:第一个是将数据提取到一个简单的基于dict
的主谓宾图,第二个是一个真实的RDF图
在这两种情况下,您将看到我将提取/转换步骤(返回一个图)和序列化步骤(使用该图)分开,使它们更易于重用:
- 基于
dict
的转换通过简单的dict
或defaultdict
实现。序列化步骤对两者都是通用的
- 基于
rdflib.Graph
的转换对于两种序列化是通用的:一种是针对您的格式,另一种是针对任何可用的rdflib.Graph
序列化
这将从a
字典中构建一个简单的基于dict
的图表:
graph={}
对于a中的e:
subj=e[“实体1”]
图[subc]={}
#:entity1a:EntityType1。
obj=e[“实体类型1”]
图形[subc][“a”]=obj
#:Entity1:关系“Entity2”。
pred,obj=e[“关系”],e[“实体2”]
图[subc][pred]=obj
打印(图形)
像这样:
:X450-G2 a :switch.
:X450-G2 :hasFeatures "Role-Based Policy".
:X450-G2 :hasLocation "WallJack".
:ers3600 a :switch.
:ers3600 :hasFeatures "ExtremeXOS".
:slx9540 a :router.
:slx9540 :hasFeatures "ExtremeXOS".
:slx9540 :hasLocation "Chasis".
{'X450-G2':{'a':'switch',
“hasFeatures”:“基于角色的策略”,
'hasLocation':'WallJack'},
'ers 3600':{'a':'switch',
'hasFeatures':'ExtremeXOS'},
'slx 9540':{'a':'router',
“hasFeatures”:“ExtremeXOS”,
'hasLocation':'Chasis'}})
或者,以较短的形式,使用defaultdict
:
从集合导入defaultdict
图形=默认dict(dict)
对于a中的e:
subj=e[“实体1”]
#:entity1a:EntityType1。
图形[subc][“a”]=e[“EntityType1”]
#:Entity1:关系“Entity2”。
图[subc][e[“关系”]=e[“实体2”]
打印(图形)
这将打印您的主谓宾语。
从图形中打印三个:
def正常化(文本):
返回文本。替换(“”,“”)
对于sub,在graph.items()中的po:
subj=标准化(SUBK)
#:entity1a:EntityType1。
打印(':{}a:{}.'.format(subc,po.pop(“a”))
对于采购订单项()中的pred、obj:
#:Entity1:关系“Entity2”。
打印(':{}:{}{}.'.格式(subc、pred、obj))
打印()
像这样:
:X450-G2 a :switch.
:X450-G2 :hasFeatures "Role-Based Policy".
:X450-G2 :hasLocation "WallJack".
:ers3600 a :switch.
:ers3600 :hasFeatures "ExtremeXOS".
:slx9540 a :router.
:slx9540 :hasFeatures "ExtremeXOS".
:slx9540 :hasLocation "Chasis".
这将使用rdflib
库构建真实的RDF图:
从rdflib导入图形、文字、URIRef
从rdflib.namespace导入RDF
A=RDF.type
图=图()
对于a中的d:
subj=URIRef(标准化(d[“Entity1”]))
#:entity1a:EntityType1。
图1.add((
Subc,
A.
URIRef(规范化(d[“EntityType1]”)
))
#:Entity1:关系“Entity2”。
图1.add((
Subc,
URIRef(规范化(d[“关系])),
文字(d[“Entity2”])
))
这:
打印(图形序列化(format=“n3”)。解码(“utf-8”))
将以N3
序列化格式打印图形:
<X450-G2> a <switch> ;
<hasFeatures> "Role-Based Policy" ;
<hasLocation> "WallJack" .
<ers3600> a <switch> ;
<hasFeatures> "ExtremeXOS" .
<slx9540> a <router> ;
<hasFeatures> "ExtremeXOS" ;
<hasLocation> "Chasis" .
建议:在执行这种转换工作流时,尝试将主要步骤分开,例如:从系统加载、以一种格式解析数据、提取、转换、序列化为另一种格式、加载到另一个系统
在代码示例中,您混合了提取、转换和序列化步骤。分离这些步骤将使代码更易于阅读,从而更易于维护或重用
下面,我给你两个解决方案:第一个是将数据提取到一个简单的基于dict
的主谓宾图,第二个是一个真实的RDF图
在这两种情况下,您将看到我将提取/转换步骤(返回一个图)和序列化步骤(使用该图)分开,使它们更易于重用:
- 基于
dict
的转换通过简单的dict
或defaultdict
实现。序列化步骤对两者都是通用的
- 基于
rdflib.Graph
的转换对于两种序列化是通用的:一种是针对您的格式,另一种是针对任何可用的rdflib.Graph
序列化
这将从a
字典中构建一个简单的基于dict
的图表:
graph={}
对于a中的e:
subj=e[“实体1”]
图[subc]={}
#:entity1a:EntityType1。
obj=e[“实体类型1”]
图形[subc][“a”]=obj
#:Entity1:关系“Entity2”。
pred,obj=e[“关系”],e[“实体2”]
图[subc][pred]=obj
打印(图形)
像这样:
:X450-G2 a :switch.
:X450-G2 :hasFeatures "Role-Based Policy".
:X450-G2 :hasLocation "WallJack".
:ers3600 a :switch.
:ers3600 :hasFeatures "ExtremeXOS".
:slx9540 a :router.
:slx9540 :hasFeatures "ExtremeXOS".
:slx9540 :hasLocation "Chasis".
{'X450-G2':{'a':'switch',
“hasFeatures”:“基于角色的策略”,
'hasLocation':'WallJack'},
'ers 3600':{'a':'switch',
'hasFeatures':'ExtremeXOS'},
'slx 9540':{'a':'router',
“hasFeatures”:“ExtremeXOS”,
'hasLocation':'Chasis'}})
或者,以较短的形式,使用defaultdict
:
从集合导入defaultdict