2016-12-15 5 views
0

У меня есть два Neo4j Узлов и одно отношение:Neo4j Cypher: Как извлечь узлы с условным запросом на оздание

class StayPal 
    include Neo4j::ActiveNode 

    has_many :in, :places, origin: :owner 
    has_many :in, :shared_places, rel_class: 'HouseMate' 
end 

class Place 
    include Neo4j::ActiveNode 

    has_one :out, :owner, type: :owner_of, model_class: 'StayPal' 
    has_many :out, :house_mates, rel_class: 'HouseMate' 
end 

class HouseMate 
    include Neo4j::ActiveRel 
    include Enumable 

    creates_unique 

    from_class 'Place' 
    to_class 'StayPal' 
    type 'shared_with' 

    property :status, default: 0 

    enum_attr status: [:pending, :approved, :declined, :cancelled] 
end 

Цель: Моя цель получить места & shared_places из staypal вместе, но общие места, включенные если они статус == утверждены

Запрос:

Neo4j::Session.current.query 
    .match(n: { StayPal: { user_id: 1 } }) 
    .match('n<-[rel1:`owner_of`]-(result_places:`Place`)') 
    .match('n<-[rel2:`shared_with`]-(result_places1:`Place`)') 
    .pluck(:result_places1, :result_places) 

С этим я получаю места и общие места staypal

Но я хочу, общие места, где статус = 1

измененный запрос

Neo4j::Session.current.query 
    .match(n: { StayPal: { user_id: 1 } }) 
    .match('n<-[rel1:`owner_of`]-(result_places:`Place`)') 
    .match('n<-[rel2:`shared_with`]-result_places1:`Place`)') 
    .where('result_places1.status = 1') 
    .pluck(:result_places1, :result_places) 

Но с этим я получаю нет записей

Некоторые другие порция запросы

Neo4j::Session.current.query 
    .match(n: { StayPal: { user_id: 1 } }) 
    .match('n<-[rel1:`owner_of`]-(result_places:`Place`)') 
    .match('n<-[rel2:`shared_with`]-result_places1:`Place`)') 
    .where('result_places1.status = 1') 
    .pluck(:result_places1) 

Выход:

[CypherRelationship 1239] 

ответ

0

Вы используете API neo4j-core запросов, которые вы можете сделать и что должно позволить вам получить ActiveNode и ActiveRel объектов, но есть более высокий уровень API, который проще:

StayPal.where(user_id: 1).places(:place1).shared_places(:places2).pluck(:place1, place2) 

чтобы сделать это, я предполагал, что вы добавили эту ассоциацию Place:

has_many :both, :shared_places, type: :shared_with 

Обратите внимание, что я использовал единственную форму для переменных. Важно помнить, что когда вы соответствуете этому, он выполняет одно совпадение за раз. Сингулярные переменные помогают нам сохранить это в контексте.

Кроме того, хотя, думаю, у вас есть более глубокая проблема, связанная с тем, что ваши отношения HouseMate происходят от места до StayPal. Какова ваша модель? Если вы хотите записать двух человек, проживающих в одном доме, вы можете захотеть создать новый узел с ярлыком, например HouseMateGroup, и этот узел может указать на Place, а также на два (или более) StayPals.

EDIT:

Я думаю, что я понять ваш случай использования больше. Я бы, вероятно, сделал модель (:StayPal)-[:LIVES_IN]->(:Place)<-[:LIVES_IN]-(:StayPal)

Любой данный шаг в этом случае не соответствует идее «помощника по дому», но вы можете легко получить соседей по следующим отношениям/ассоциациям. Так что если вы хотите, чтобы получить соседей по дому вы могли бы сделать:

pal = StayPal.find_by(user_id: 1) 

pal.places.people 

Это заставило бы вас всех людей, которые находятся в местах, которые user_id: 1 находится в.

Если вы хотите, чтобы найти все места, которые связаны люди:

Place.as(:place1).people.places(:place2).pluck(:place1, :place2) 

Можно даже подсчитать количество людей, которые существуют в этих отношениях между местами:

Place.as(:place1).people(:person).places(:place2).pluck(:place1, :place2, 'count(person)') 
+0

(извините, если этот ответ не совсем на месте, я должен был ответить очень быстро. Вы также можете отказаться от нашего канала Gitter, если у вас есть другие вопросы https://gitter.im/neo4jrb/neo4j) –

+0

yes Мне нужно, чтобы у двух или более человек, один и тот же дом, и один будет тем, и другие люди придут, хотя invitati на котором у нас есть другой статус (одобрение/отклонение) .......... Прежде чем добавить это несколько пользователей в один дом, у меня было только одно место, один владелец вида функционала, у которого уже есть база данных .. любая помощь для работы с этим запросом ........... Я хочу, чтобы пользователи имели свои собственные места, а также делились с ним другими владельцами? –

+0

Только что сделал редактирование, посмотрите –

 Смежные вопросы

  • Нет связанных вопросов^_^