Python 将字典列表转换为rdf格式

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

目标:(自动化:当有大量字典时,我想生成一个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 :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