py2neo получает связанные узлы только с определенной меткой - PullRequest
0 голосов
/ 19 сентября 2019

Итак, у нас есть две метки Employee & EmailAddress, и к каждому узлу EmailAddress будет подключен максимум один узел Employee с отношением LINKED_TO.

Ниже показано, как моя py2neo модель

class BaseNeoModel(GraphObject):
    """
    Implements some basic functions to guarantee some standard functionality
    across all models. The main purpose here is also to compensate for some
    missing basic features that we expected from GraphObjects, and improve the
    way we interact with them.
    """

    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            if hasattr(self, key):
                setattr(self, key, value)

class EmployeeNeoModel(BaseNeoModel):
    __primarylabel__ = 'Employee'
    __primarykey__ = 'IdObject'
    IdObject = Property()
    Name = Property()
    NameFamily = Property()
    NameFull = Property()

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def as_dict(self):
        return {
            'user_name': self.IdObject,
            'first_name': self.Name,
            'last_name': self.NameFamily,
            'full_name': self.NameFull
        }

    def fetch(self, tribes_client_id):
        person = self.match(graph).where(IdObject=self.IdObject).first()

        if person is None:
            raise GraphQLError(f'"{self.IdObject}" has not been found in our employee list.')

        return person

    def fetch_from_email(self, tribes_client_id):
        email_address = EmailAddressNeoModel(IdObject=self.IdObject).fetch(tribes_client_id=tribes_client_id)
        # print(email_address.Name)
        connected_employees = email_address.related_employee 

        for connected_employee in connected_employees:
            print(connected_employee)

        # print(connected_employee)
        #
        # return connected_employee
        return connected_employees


class EmailAddressNeoModel(BaseNeoModel):
    __primarylabel__ = 'EmailAddress'
    __primarykey__ = 'IdObject'
    IdObject = Property()
    Name = Property()
    NameFamily = Property()
    NameFull = Property()

    related_employee = Related(EmployeeNeoModel, "LINKED_TO")

    def __init__(self, **kwargs):
        super().__init__(**kwargs)

    def fetch(self, tribes_client_id):
        email_address = self.match(graph).where(IdObject=self.IdObject).first()
        return email_address

EmployeeNeoModel(IdObject="vinit@tribes.ai").fetch_from_email("demo_com")

Итак, в основном, в коде выше мы делаем подключение узла сотрудника к переданному узлу EmailAddress.

Теперь, когда я звоню fetch_from_email, я ожидаю получить только Employee узлыкоторые подключены к переданным узлам EmailAddress, но я получаю все узлы, подключенные к EmailAddress узлу, т.е. также узлы, у которых нет метки Employee.

То, как я понимаю, констатируя related_employee = Related(EmployeeNeoModel, "LINKED_TO") amГоворя py2neo возвращать только узлы с меткой Сотрудника, я неправильно понимаю, если да, как правильно достичь выше?

...