neo4j 在NeoModel中创建之前查看节点是否存在

cigdeys3  于 2022-11-05  发布在  其他
关注(0)|答案(5)|浏览(402)

neomodel中创建一个节点之前,我如何检查它是否存在?除了过滤器之外,有没有其他方法可以优化我的代码?

ohfgkhjo

ohfgkhjo1#

Kishore的回答是,我之所以这样做,是因为我想检查对象是否存在,而且有时我会为自己插入一个ID,因为它来自另一个DB,我想保持兼容性,所以这样做了:

class DefaultMixin:
    date_added = DateTimeProperty()
    nodes: NodeSet  # makes pycharm smarter

    def exists(self,**filters):
        if not filters:
            if not self.id:
                raise KeyError('no filters or id provided')
            filters['id'] = self.id
        return bool(self.nodes.first_or_none(**filters))
mznpcxlj

mznpcxlj2#

我在我的每个StructuredNode类上创建了一个装饰器,它在初始化时检查节点。

def check_if_node_exists(node):
    def node_checker(**kwargs):
            result = node.nodes.first_or_none(**kwargs)
            if result == None:
                print("Creating New Node")
                return node(**kwargs).save()
            print("Returning Existing Node")
            return result

    return node_checker

@check_if_node_exists
class Employee(StructuredNode):
    name = StringProperty()

要调用它,只需创建类的示例:

employee1 = Employee(
    name = "test_name"
)
11dmarpk

11dmarpk3#

您可能需要以下批处理操作之一:

  • 创建或更新()
  • 获取或创建()
quhf5bfb

quhf5bfb4#

我已经创建了自己的查询来做这件事。检查它是否有帮助。

def exists(node=None, property=None, value=None):
    filter_node = (":" + node) if node != None else ''
    filter_value = ("{" + property + ": '" + value + "'}") if property != None and value != None else '' 
    return db.cypher_query("MATCH(n" + filter_node + filter_value + ")" + " return count(n) > 0 as exists;"  )[0][0][0]

exists(node='User')
kb5ga3dv

kb5ga3dv5#

您可以使用first_or_none来检查节点是否存在。
示例:

person = Person.nodes.first_or_none(name='James')
if person == None:
    personNew = Person(name='James').save()

相关问题