首页 > 编程问答 >Neo4j:如何将参数传递给关系?

Neo4j:如何将参数传递给关系?

时间:2024-07-28 13:53:25浏览次数:8  
标签:python neo4j cypher neo4j-apoc

neo4j官网指出,我们不能向关系类型传递参数。 但是,我在批量添加嵌入时需要向关系传递参数。

Neo4j通过

    driver.execute_query('''
    UNWIND $movies as movie
    MATCH (m:Movie {title: movie.title, plot: movie.plot})
    CALL db.create.setNodeVectorProperty(m, 'embedding', movie.embedding)
    ''', movies=nodes_with_embeddings, database_=DB_NAME)

为节点添加批量向量。为节点添加嵌入属性

此代码使用 $movies 传递参数并传递 movie.title 作为属性值。每个 movie 都是一个字典。 但是,我无法使用 $datas like MATCH (h:Entity {id: data.id})-[r: data.r]->(t:Entity {id: data.id})

传递关系类型,我尝试过使用字符串的公共串联来传递参数,并一一添加嵌入属性。 例如 "MATCH (h:Entity {id: data.h_id})-[r:"+data['r']+"]->(t:Entity {id: data.t_id}) 但是我想使用批量操作来加快速度。

有没有办法将参数传递给批量操作的关系? 谢谢你的时间。


你说的对,Neo4j 的 Cypher 语法目前不支持直接将参数传递给关系类型。不过,你想要实现批量操作,可以使用 APOC 库提供的 apoc.periodic.iterate 函数来达到类似的效果。

以下是如何使用 apoc.periodic.iterate 和参数进行批量操作,并为关系添加嵌入属性的示例:

driver.execute_query(
    '''
    CALL apoc.periodic.iterate(
        "UNWIND $datas AS data RETURN data",
        "
        MATCH (h:Entity {id: data.h_id})
        MATCH (t:Entity {id: data.t_id})
        CALL apoc.create.relationship(h, data.r, {embedding: data.embedding}, t) YIELD rel
        RETURN count(*)
        ",
        {batchSize:10000, parallel:false, params:{datas: $datas}}
    )
    ''',
    datas=your_data
)

代码解释:

  1. apoc.periodic.iterate : 这个 APOC 函数允许你迭代执行 Cypher 语句。它接受三个参数:

    • 第一个参数是一个 Cypher 语句,用于生成要迭代的数据。这里我们使用 UNWIND 展开传入的参数 datas
    • 第二个参数是另一个 Cypher 语句,它将针对迭代生成的每一行数据执行。在这里,我们匹配节点,使用 apoc.create.relationship 创建关系,并设置嵌入属性。
    • 第三个参数是一个 map,包含迭代的配置选项和参数。
      • batchSize : 每次迭代处理的数据量。
      • parallel : 是否并行执行迭代。
      • params : 传递给迭代的 Cypher 语句的参数。
  2. datas : 这是一个 Python 列表,包含字典,每个字典代表一个关系和其嵌入信息:

your_data = [
    {"h_id": "entity1", "t_id": "entity2", "r": "RELATED_TO", "embedding": [0.1, 0.2, 0.3]},
    {"h_id": "entity3", "t_id": "entity1", "r": "KNOWS", "embedding": [0.4, 0.5, 0.6]},
    # ... 更多关系数据
]

优势:

  • 批量操作: apoc.periodic.iterate 允许你高效地处理大量数据,因为它会将数据分成多个批次进行处理。
  • 灵活性: 你可以根据需要自定义关系类型和嵌入属性。

注意事项:

  • 确保你的 Neo4j 数据库安装了 APOC 库。
  • 根据你的数据量和硬件配置调整 batchSize 参数以获得最佳性能。

希望这个方法可以帮助你解决问题!

标签:python,neo4j,cypher,neo4j-apoc
From: 78796966

相关文章

  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......
  • 如何在 wxPython 的 for 循环中添加文本输入框?
    我是wxPython的新手,正在开发一个带有GUI的基本程序,让用户标记图像。现在,当用户单击“导入”按钮时,他们可以选择一个目录。然后,代码使用matplotlib在for循环中显示该目录中的每个图像。但是,我不知道如何在for循环中访问用户输入。这就是该函数现在的样子:importmatplo......
  • 【Python】字母 Rangoli 图案
    一、题目YouaregivenanintegerN.YourtaskistoprintanalphabetrangoliofsizeN.(RangoliisaformofIndianfolkartbasedoncreationofpatterns.)Differentsizesofalphabetrangoliareshownbelow:#size3----c------c-b-c--c-b-a-b-c--c......
  • python 闭包、装饰器
    一、闭包:1.外部函数嵌套内部函数 2.外部函数返回内部函数 3.内部函数可以访问外部函数局部变量         闭包(Closure)是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量,即使外部函数已经执行完毕,这种现象称为闭包。在Python中,闭包常常用......
  • 掌握 IPython %%time 魔法命令:高效测量代码块执行时间
    引言在编程和数据分析中,了解代码的执行时间是优化性能的关键步骤。IPython,作为一个强大的交互式计算环境,提供了多种工具来帮助用户测量和优化代码。其中,%%time魔法命令是IPython中用来测量代码块执行时间的便捷工具。本文将详细介绍%%time魔法命令的使用方法,并通过一......
  • 探索 IPython 中的 %%javascript 魔法命令:运行 JavaScript 代码的秘籍
    引言IPython是一个强大的交互式计算环境,它不仅支持Python语言,还通过各种魔法命令扩展了其功能。其中,%%javascript魔法命令是IPython扩展中一个非常有趣的特性,它允许用户在IPython环境中直接运行JavaScript代码。这对于需要在数据科学和科学计算中使用JavaScript......
  • pythonasm库分析,看看你和自学编程小学生的差距
    下面是pythonasm.asm库的源代码fromkeystoneimport*fromcapstoneimport*assembly_instructions=[]#储存汇编指令的列表#汇编指令写入列表defmov(reg1,reg2):assembly_instructions.append(f"mov{reg1},{reg2}")defdb(value):assembly_instructio......
  • 【Python系列】Python 中的垃圾收集:深入理解与实践
    ......