Neo4jrb Проблема наследования и области видимости при вызове отношений
Я использую Neo4jrb с Rails, и я пытаюсь максимально использовать методы цепочки QueryProxy для построения сложных запросов, но я застрял при рассмотрении узлов с несколькими метками из-за наследования. Следующий необработанный пример может дать вам представление:
class Person
include ActiveGraph::Node
property :name, type: String
property :gender, type: String
has_many :out, :socials, type: :HAS_ACCOUNT, model_class: 'Social', unique: true
end
class Social
include ActiveGraph::Node
# nothing relevant
end
class Facebook < Social
# Inheriting from Social, the labels for Facebook nodes are [:Social, :Facebook]
property :name, type: String
# other properties
has_many :out, :friends, type: :FRIENDS_WITH, model_class: 'Facebook', unique: true
end
class Instagram < Social
# Inheriting from Social, the labels for Instagram nodes are [:Social, :Instagram]
# some property and relationship
end
Простой рабочий запрос - получить / запросить имя учетной записи Facebook Человека:
Person.as(:p).socials.where(name: "Someone")
Которые возвращают следующий зашифрованный запрос:
Person#socials
MATCH (n:`Person`)
MATCH (n)-[rel1:`HAS_ACCOUNT`]->(result_socials3:`Social`)
WHERE (result_socials3.name = $result_socials3_name)
RETURN result_socials3 | {:result_socials3_name=>"Someone"}
Таким образом, при запросе свойств производного класса (Facebook) класса model_class, указанного в отношении Person, ошибок не возникает.
Однако, когда я пытаюсь запросить отношения, определенные в Facebook, activegraph не находит их и возвращает следующую ошибку:
Person.as(:p).socials.friends
# OR
Person.as(:n).socials.branch { friends }
# ERROR
`method_missing': undefined method `friends' for #<AssociationProxy Person#socials []> (NoMethodError)
Вопросов:
- Почему я могу запросить свойства производного класса, указанного в model_class в отношениях Person, но я не могу запросить его отношения
- Есть ли способ запросить отношения производных классов? Или, может быть, временно изменить объем?
- Есть ли способ указать метку конечного узла ассоциации? Например, когда я запрашиваю Person.socials , могу ли я определить конечные метки, отличные от «Social», для AssociationProxy Person # social?
Я уже пробовал такие методы, как «scoping», «branch» и «as_models», но, насколько мне известно, ни один из них не работает.
Примечание. Работает следующий шифровальный запрос:
MATCH (p:Person)
MATCH (p)-[:HAS_ACCOUNT]->(s:Social)
MATCH (s)-[:FRIENDS_WITH]->(f)
RETURN p.name