首页 > 编程问答 >我可以在 Neo4 模型中过滤半结构化节点吗?

我可以在 Neo4 模型中过滤半结构化节点吗?

时间:2024-07-23 05:59:18浏览次数:11  
标签:python neo4j neomodel

我正在使用带有 Neo4j 数据库的 Neomodel Python 包,并且很喜欢它。 我当前正在使用 filter() 方法,但每次我对 SemiStructuredNode 中未定义的属性使用 filter() 方法时,都会收到错误。

在下面的示例中,我的 Person SemiStructuredNode 仅以姓氏作为属性,但数据库中的某些节点可能也有 eye_colour,我想通过它进行过滤。 请注意,并非所有节点都有眼睛颜色。

class Person(SemiStructuredNode):
    surname = StringProperty()
Person.nodes.filter(surname__contains='atts',eye_colour='BLUE')

对我来说,上面的代码应该可以工作,但我收到了 ValueError: No such property eye_colour on Person 错误。 但是,如果我更改类定义以将 eye_colour 作为 StringProperty 包含在内,则一切都很好。 但是,我不想这样做,因为我想使用各种其他动态过滤器,因为不同的数据被导入到系统中。

Neomodel 是否支持我正在尝试做的事情,或者我必须构建一个密码查询或者有人可以看到我做错了什么吗?


你确实发现了 Neomodel 中的一个限制。虽然 SemiStructuredNode 非常适合处理灵活的架构,但 Neomodel 的 filter() 方法目前无法处理没有为类定义为属性的动态属性。

可选解决方法

1. 原始密码查询

为了获得最大的灵活性,你可以使用原始密码查询。这使你可以完全控制过滤逻辑。

from neomodel import db

results, meta = db.cypher_query(
    "MATCH (p:Person) WHERE p.surname CONTAINS 'atts' AND p.eye_colour = 'BLUE' RETURN p"
)

# 将结果映射回 Person 实例(如果需要)
people = [Person.inflate(row[0]) for row in results] 

2. 动态属性访问

你可以使用 __getattr__ __contains__ SemiStructuredNode 类中添加一个自定义方法,以直接在节点数据上运行检查:

class SemiStructuredNode(StructuredNode):
    def has_property_value(self, prop, value):
        return prop in self and self[prop] == value

class Person(SemiStructuredNode):
    surname = StringProperty()

filtered_people = [p for p in Person.nodes.filter(surname__contains='atts') 
                  if p.has_property_value('eye_colour', 'BLUE')]

限制

请记住,这些解决方法有一些权衡:

  • 密码查询: 虽然提供了灵活性,但需要你手动将结果映射回 Neomodel 对象。
  • 动态属性访问: filter() 之后需要一个额外的循环来进行过滤,这对于大型数据集来说效率可能较低。

结论

目前,你必须使用变通方法来使用 Neomodel 过滤 SemiStructuredNode 中的未定义属性。选择最适合你需求的方法,同时牢记每个选项的优缺点。

标签:python,neo4j,neomodel
From: 66479006

相关文章

  • Python:支持索引的内存对象数据库?
    我正在做一些数据整理,如果我可以将一堆字典放入内存数据库中,然后对其运行简单的查询,这会简单得多。例如,类似:people=db([{"name":"Joe","age":16},{"name":"Jane","favourite_color":"red"},])over_16=db.filter(age__g......
  • 如何构建一维数组的二维数组的特定 Python 结构?
    如何构建一维数组(即行向量)的二维数组的特定结构以满足特定我正在维护的遗留程序的结构?我可以在此结构中生成正确的内容all_measurements[:12]array([[0.,0.,0.,2.],[0.02,0.334,0.04,2.24],[0.04,0.668,0.08,2.48],...........
  • 如何使用 Python Flask 将新的咖啡馆(元素)添加到数据库(SQLite)?
    这是我的代码:@app.route("/add",methods=["POST"])defpost_new_cafe():new_cafe=Cafe(name=request.form.get("name"),map_url=request.form.get("map_url"),img_url=request.form.get("img......
  • 使用 tkinter 为 python 创建 GUI 时如何解决语法错误?
    我是一名Python初学者,决定使用tkinter制作一个小型GUI,该GUI接受用户(潜在餐馆)的3个输入,然后单击按钮后随机输出其中一家餐馆。我不断收到语法错误,并认为它与我的buttonfunc或调用它的命令有关。此代码尚未包含在GUI上输出餐厅的任何位置。任何帮助将不胜感激#Pyth......
  • 在 python 中打开 gnome 终端立即显示为僵尸
    作为背景,我正在编写一个脚本来训练多个pytorch模型。我有一个训练脚本,我希望能够在gnome终端中作为子进程运行。这样做的主要原因是我可以随时关注训练进度。如果我可能有多个GPU,我想在单独的窗口中多次运行我的训练脚本。为了实现这一点,我一直在使用popen。以下代码用于打......
  • python threading.Condition 的意外行为
    我正在尝试同步多个线程。我期望使用threading.Condition和threading.Barrier时的脚本输出大致相同,但事实并非如此。请解释一下为什么会发生这种情况。一般来说,我需要线程在一个无限循环中执行工作(一些IO操作),但是每个循环都是以主线程的权限开始的,而权限是仅在......
  • Python - 逆透视数据框
    我有一个按日期时间索引的表,每个日期时间都有多个层(中心和交货间隔):日期时间中心交货间隔结算点价格2024-01-0101:00:00休斯顿中心1......
  • 试图理解这个错误:致命的Python错误:PyEval_RestoreThread:该函数必须在持有GIL的情况下
    我有一个小型tkinter应用程序,我一直在其中实现最小的“拖放”,主要作为学习实验。我真正关心的是删除文件的文件路径。一切实际上都工作正常,直到我尝试在拖放后打包标签小部件。下面的最小工作示例。有问题的行会用注释指出。我通常不会在调试方面遇到太多麻烦,但我只是不知......
  • 如何使代码格式再次适用于 Python(Mac 上的 Visual Studio Code)?
    在Mac上,Option+Shift+F现在会显示“没有安装用于‘python’文件的格式化程序”。消息框:我尝试安装这个插件,但没有看到这种情况的变化:我已经为Python安装了这两个插件:但是正如@starball提到的,它可能已经减少了支持现在。......
  • 无法在 python 中安装 pip install expliot - bluepy 的 Building Wheel (pyproject.t
    在此处输入图像描述当我尝试在Windows计算机中通过cmd安装pipinstallexpliot包时,我收到2个错误名称×Buildingwheelforbluepy(pyproject.toml)didnotrunsuccessfully.│exitcode:1**AND**opt=self.warn_dash_deprecation......