知识图谱。pg数据库批量导入neo4j中

该代码示例展示了如何使用Python类`jigsaw`和`carrier`来与Neo4j图数据库交互。`jigsaw`类包含了创建索引、从关系型数据库加载节点和关系、以及批处理加载带有多重关系的数据的功能。这些方法使用了APOC库的`apoc.load.jdbc`来从PostgreSQL加载数据,并通过Cypher语句构建图结构。
摘要由CSDN通过智能技术生成

class carrier(object):
    
    def __init__(value):
        value=value 

    def get_driver(self):       # 获取neo4j的session
        driver = GraphDatabase.driver('bolt://localhost:7687', auth=('test', '11'))#本地neo4j
       
        return driver

    def run_cypher(self,cypher):  # 运行cypher
        driver=self.get_driver()
        with driver.session() as session:
            with session.begin_transaction() as tx:
                run=tx.run(cypher)
                return run


class jigsaw(object):

    def __init__(value):
        value=value

    def create_index(self,label,attri):
        attri='''('''+attri+''')'''
        cypher=f'''CREATE INDEX ON:{label}{attri}'''
        c=carrier()
        tx=c.run_cypher(cypher)
        return cypher

    def load_node(self,source,query,label,check):  # 抽取节点数据(source:数据来源类型,query:查询语句,label:节点标签)
        cypher=f'''
        call apoc.load.jdbc("{source}","{query}") YIELD row
        merge(n:{label} {check}) set n=row
        '''
        #print(cypher)
        c=carrier()
        tx=c.run_cypher(cypher)
        return cypher
    def load_set_entity_and_relationship(self,source,query,label,check,set_attri,label_e,check_e,relation1,relation2):
        cypher = f'''
        call apoc.load.jdbc("{source}","{query}") YIELD row
        merge (n:{label} {check}) set {set_attri} with*
        merge(n_e:{label_e} {check_e}) with *
        merge (n)-[:{relation1}]->(n_e)
        merge (n_e)-[:{relation2}]->(n)
        '''
        c = carrier()
        tx = c.run_cypher(cypher)
        return cypher

    def load_entity_and_2_relationship(self,source,query,label,check,label_e,check_e,relation1,relation2):  # 抽取关系数据(source:数据来源类型,query:查询语句,label:节点标签,label_end:尾部节点标签,relationtype:关系类型)
        cypher=f'''
        call apoc.load.jdbc("{source}","{query}") YIELD row
        merge (n:{label} {check}) with *
        merge (n_e:{label_e} {check_e}) with *
        merge (n)-[:{relation1}]->(n_e)
        merge (n_e)-[:{relation2}]->(n)
        '''
        c=carrier()
        tx=c.run_cypher(cypher)
        return cypher
    def load_entity_and_1_relationship(self,source,query,label,check,label_e,check_e,relation):
        cypher=f'''
        call apoc.load.jdbc("{source}","{query}") YIELD row
        merge (n:{label} {check}) with *
        merge (n_e:{label_e} {check_e}) with *
        merge (n)-[:{relation}]->(n_e)
        '''
        c=carrier()
        tx=c.run_cypher(cypher)
        return cypher
    def batch_entity_and_2_relationship(self,source,query,label,check,label_e,check_e,relation1,relation2):
        batch='''{batchsize:10000,parallel:false,iteratelist:true}'''
        cypher=f'''
        CALL apoc.periodic.iterate(
        'call apoc.load.jdbc("{source}",characterEncoding=utf-8,"{query}") YIELD row'
        ,'merge (n:{label} {check}) with *
        merge (n_e:{label_e} {check_e}) with *
        merge (n)-[:{relation1}]->(n_e)
        merge (n_e)-[:{relation2}]->(n)'
        ,{batch}
        )
        '''
        c=carrier()
        tx=c.run_cypher(cypher)
        return cypher

    def load_use_unwind_entity_and_2_relationship(self, source, query, label,check, check_split,label_e, check_e,relation1, relation2):
        cypher = f'''
        call apoc.load.jdbc("{source}","{query}") YIELD row
        UNWIND split({check}, ',') AS filename
        merge (n:{label} {check_split}) with *
        merge (n_e:{label_e} {check_e}) with *
        merge (n)-[r:{relation1}]->(n_e)
        merge (n_e)-[:{relation2}]->(n)
        '''
        c = carrier()
        tx = c.run_cypher(cypher)
        return cypher

    def batch_use_unwind_entity_and_2_relationship(self, source, query, label,check, check_split,label_e, check_e,relation1, relation2):
        batch = '''{batchsize:10000,parallel:false,iteratelist:true}'''
        cypher = f'''
        CALL apoc.periodic.iterate(
        'call apoc.load.jdbc("{source}","{query}") YIELD row',
        'UNWIND split({check}, ",") AS filename
        merge (n:{label} {check_split}) with *
        merge (n_e:{label_e} {check_e}) with *
        merge (n)-[r:{relation1}]->(n_e)
        merge (n_e)-[:{relation2}]->(n)'
        ,{batch}
        )
        '''
        c = carrier()
        tx = c.run_cypher(cypher)
        return cypher


def main():
    l=jigsaw()
 
    source = "jdbc:postgresql://10.100.200.191:5433/postdb1?user=postuser1&password=postuser123"
    table_info = '''select * from pmart.dm_skill_file_info'''

    l.load_entity_and_2_relationship(source,table_info,'''文檔''','''{name:row.attachment}''','''員工''','''{工號:row.author_no}''','''作者是''','''上傳的文檔有''')

   

    starttime = time.time()

    endtime = time.time()
    print(endtime - starttime)
if __name__=='''__main__''':
    main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值