Извлекать свойства взаимосвязи с помощью graphene-django и graphql из базы данных graph (neo4j)

#django #neo4j #graphql #graphene-python #graphene-django

#django #neo4j #graphql #graphene-python #graphene-django

Вопрос:

Я пытаюсь создать простое приложение (для создания graphql api с использованием django и python). Все идет хорошо, но я застрял с одной проблемой, и я понятия не имею, как с этим справиться (я искал несколько дней, но я просто сдаюсь), поэтому я надеялся, что кто-нибудь здесь сможет помочь (смотрите Ниже, что у меня есть).

Я использую Django с graphene-django и neo4j в качестве базы данных (graph). Также я использую схему ретрансляции.

С помощью graphql я могу запрашивать все свойства продуктов, а также можно запрашивать отношения (какой продукт принадлежит к какой категории и наоборот).

Теперь моя проблема заключается в следующем: в neo4j отношения также имеют свои собственные свойства, но я понятия не имею, как получить эти свойства (например, я хочу видеть, когда было создано отношение, это свойство отношения).

В настоящее время у меня есть 2 типа узлов: Категория и продукт См. модели (models.py) ниже:

 class Category(StructuredNode):    
    name = StringProperty()
    shortname = StringProperty()
    product = Relationship('Product','IN_CATEGORY')

class Product(StructuredNode):
    name = StringProperty()
    price = StringProperty()
    description = StringProperty()
    category = Relationship('Category','IN_CATEGORY')
  

Ниже приведен код graphene-django, который я использую (schema.py):

 class CategoryType(DjangoObjectType):   
    class Meta:
        model = Category
        neomodel_filter_fields = {
            'name': ['exact', 'icontains'],
            'shortname': ['exact'],
        }
        interfaces = (relay.Node, )

class ProductType(DjangoObjectType):
   
    class Meta:
        model = Product
        neomodel_filter_fields = {
            'name': ['exact', 'icontains'],
            'price': ['exact'],
        }
        interfaces = (relay.Node, )
  

Я подумал о том, что, возможно, я могу попытаться создать дополнительное поле и написать распознаватель, который выполняет необработанный запрос для получения отношений и свойств (как показано ниже)

 class ProductType(DjangoObjectType):
    relationship = graphene.String()
    
    class Meta:
        model = Product
        neomodel_filter_fields = {
            'name': ['exact', 'icontains'],
            'price': ['exact'],
        }
        interfaces = (relay.Node, )
        
    def resolve_relationship(root,info, args):
        #perform the raw query here
    
  

Теперь, чтобы выполнить взаимосвязь, мне, конечно, нужны 2 идентификатора, чтобы выполнить запрос следующим образом:
совпадение (n: Категория)-[r]->(x: Продукт), где id (n) = 2358 И id (x) = 187 возвращают n, x, r
таким образом, я могу получить свойства отношений r.

Моя проблема в том, что я не могу получить идентификатор подключенного узла (только root.id).Есть ли способ получить родительский идентификатор? Или весь мой образ мышления неверен, и есть функция (о которой я не знаю, может быть, в graphene?) это может сделать то, что я хочу, другим (надеюсь, лучшим) способом?

Спасибо за помощь.

Ответ №1:

Я не использовал neo4j с django, но это должно сработать:

 class ProductType(DjangoObjectType):
   relationship = graphene.String()

   class Meta:
      model = Product
      neomodel_filter_fields = {
          'name': ['exact', 'icontains'],
          'price': ['exact'],
      }
      interfaces = (relay.Node, )
    
  def resolve_relationship(self, root,info, args):
      return self.id # or self.relationship.id or do any thing you want
         
  

Свойства модели также могут работать
Вам необходимо добавить relationship = graphene.String(source="<name-of-the-property>")