2017-02-13 17 views
0

Пусть мыКак я могу получить все ActiveRel между двумя ActiveNode в Neo4j ruby?

  • Node: User
    • name: String
  • Rel: Transaction
    • amount: Поплавок

Представление упрощенной транзакции, подобной биткойну, где Пользователь отправляет монеты другим пользователям. Сделка имеет свойство amount, которое показывает, сколько монет вы отправляете на номер to_node от from_node.

Затем я хочу получить все транзакции (одно- или двунаправленно) между Алисой и Бобом. Как я могу это сделать?

# user.rb 
has_many :out, :receivers, rel_class: :Transaction 
has_many :in, :senders, rel_class: :Transaction 


# Console 
alice = User.find_by(name: "Alice") 
bob = User.find_by(name: "Bob") 

# I want to do something like this: 
Transaction.between(from: alice, to: bob) 

# or this: 
alice.receivers.rel_where(to_node: bob) 

Я был удивлен, что последнее неприемлемо. Он включает в себя bob непосредственно в CYPHER.

Использование Neo4jrb v8.0.0

ответ

0

я боролся и пришел знать, что я могу сделать что-то вроде этого:

alice.receivers.match_to(bob).pluck(:rel1) 

С этим мы можем получить все транзакции, отправленные с alice в bob, но я думаю, это не очень хорошая идея, используя магический :rel1 здесь (который доступен, потому что он автоматически записывается в CYPHER, а match_to возвращает объект QueryProxy: match_to)

Но всегда очень не рекомендуется получать только Rels.
Относительно, мы могли бы

alice.receivers.match_to(bob).rel_where(amount: 1.0) # Txs which amount are 1.0btc 

и

alice.receivers.match_to(bob).each_rel.sum {|rel| rel.amount } # All the sent money! 


Обратите внимание, что вы не можете сделать это (то):

alice.receivers.match_to(bob).rel_where("rel1.amount < 10.0") 

но может идти вокруг с это:

query = alice.receivers.match_to(bob)   # create just the query 
query.where("#{query.rel_var}.amount < 10.0") # you can get `:rel1` by `rel_var` 
+0

И теперь я заметил другое: вы можете получить все Rels 'rels' и только первый из' rel', например 'alice.receivers.match_to (bob) .rels'. Но это может быть устаревшим (особенно 'rel', см. [This] (https://github.com/neo4jrb/neo4j/issues/697)), поэтому не рекомендуется делать это – Todoroki

+0

FYI вы можете передавать аргументы в ассоциацию с определите переменные node/rel, такие как: 'alice.receivers (: node_var,: rel_var)' –

+0

@BrianUnderwood: О, спасибо, так что это способ сделать это ... Я посмотрел на [вопрос о добавлении Rel querying] (https://github.com/neo4jrb/neo4j/issues/697), но он пока еще не разработан (и он сказал, что это будет '.where (node_var:, rel_var:)' или 'where (node_var) ,отн (rel_var) '). Кроме того, он ничего не возвращает [при поиске в документе] (http://neo4jrb.readthedocs.io/en/8.0.x/search.html?q=node_var&check_keywords=yes&area=default#). – Todoroki

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

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