2017-12-18 9 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

또한 내 쿼리에는'where not' 다음에 쓰여진 match가 있습니다. 모든 match 문은 함께 실행될 때 함께 그룹화됩니다. –

+1

변수를 정의하는'MATCH' 절로 적절한'WHERE' 절을 명확하게 그룹화해야합니다. 내가 일반적으로 이해하지 못하는 한가지는'WHERE'가 실제로 MATCH에 대한 수정 자라는 것입니다. 자신의 절이 아닙니다. –