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

See if node exists before creating in NeoModel

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

您可能正在寻找以下批处理操作之一:

我为此创建了自己的查询。检查是否有帮助。

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')

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

示例:

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

扩展@raman Kishore 的回答,我这样做了,因为我想检查对象是否存在,而且有时我会为自己插入一个 ID,因为它来自另一个数据库,我想保持兼容性,所以做了以下事情:

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))

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

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()

要调用它,只需创建 class:

的一个实例
employee1 = Employee(
    name = "test_name"
)