2017-12-18 6 views
1

は、私は私がのNeo4jコンソール上で行われ、長いクエリを持っているので、ORMのスタイルを使用したくないレールで直接サイファーのクエリを実行したい私は、そのが期待通りに動作しないORMのスタイルに変更しようとしていたときにNeo4j.rb Cypherクエリを直接実行するには?

MATCH (n {name: 'MU1'})-[:connected_to*1..2 {status: 1}]->(sp:User), 
     (sp)<-[:owner_of|house_mate]-(place:Place)-[:owner_of|house_mate]->(c:User) 
WHERE NOT (n)-[:house_mate]-(place) 
MATCH 
    (place)-[tenant:owner_of|house_mate]->(u:User) 
WITH DISTINCT place, type(tenant) AS type, u 
WITH place, collect({type: type, u: u}) AS tenants 
RETURN 
    place, 
    [tenant IN tenants WHERE tenant.type = 'owner_of' | [tenant.u]][0] AS owner, 
    [tenant IN tenants WHERE tenant.type = 'house_mate' | [tenant.u]] AS houseMatesArray 

Neo4j.queryとNeo4j._query etc

ヘルプが必要ですか?

編集:ORMスタイルで書き込む方法が間違っていた可能性がありますか?

答えて

1

ここにはコメントで要求された通りのQueryスタイルがあります。しかし、このようなクエリでは、部分的にQueryオブジェクトを渡していない限り、このスタイルから多くの利益を得ることはできません。おそらく、Rubyのheredocで定義されたCypherクエリに固執したいと思うでしょう。

Neo4j::ActiveBase.new_query 
    .match(n: {name: 'MU1'}) 
    .match('(n)-[:connected_to*1..2 {status: ?}]->(sp:User)', 1) 
    .match('(sp)<-[:owner_of|house_mate]-(place:Place)-[:owner_of|house_mate]->(c:User)') 
    .where_not('(n)-[:house_mate]-(place)') 
    .break 
    .match('(place)-[tenant:owner_of|house_mate]->(u:User)') 
    .with('DISTINCT place, type(tenant) AS type, u') 
    .with(:place, tenants: 'collect({type: type, u: u})') 
    .pluck(:place, 
      owner: '[tenant IN tenants WHERE tenant.type = 'owner_of' | [tenant.u]][0]', 
      houseMatesArray: '[tenant IN tenants WHERE tenant.type = 'house_mate' | [tenant.u]]') 

それはので、私は今しばらくの間、逆たいと思っていた設計上の決定のだけれどもあなたは、グループ化からmatch句を保つためにそこにbreakを必要としています。

DISTINCT(IIRC)は列全体に適用されるため、with_distinctメソッドが必要であるとも考えています。

+0

私を助けてくれてありがとう、私はあなたから多くのことを学びました –

1
Neo4j::ActiveBase.current_session.query(cypher_query_string) 
+0

あなたはORMスタイルと同様に '.match()。where()etc'のように書く方法を教えてください。 –

+0

また、私のクエリでは、 'どこではない'の後に書かれたマッチがあります。最初に実行するために一緒にグループ化されたすべてのマッチステートメント、 –

+1

変数を定義する 'MATCH'節で適切な' WHERE'節をグループ化する必要があります。私が一般に理解されていないと思うことは、 'WHERE'は本当に' MATCH'の修飾語であり、自分の句ではありません。 –

関連する問題