2017-12-18 1 views
1

Ich möchte direkt Cypher-Abfragen in Schienen laufen wollen nicht ORM Stil verwenden, weil ich lange Anfragen, die ich auf Neo4j Konsole gemacht und wenn ich versuche, in orm Stil verhält es ist nicht soNeo4j.rb Wie Cypher Abfrage direkt ausführen?

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 
erwartet sich ändern

Neo4j.query und Neo4j._query usw.

Hilfe?

Edit: Wie schreibe ich es in ORM-Stil kann ich etwas falsch machen?

Antwort

1

Hier ist Query Stil wie in den Kommentaren gefordert. Mit einer Abfrage wie dieser erhalten Sie jedoch keinen großen Nutzen von diesem Stil, es sei denn, Sie übergeben nur teilweise Query Objekte herum. Wahrscheinlich möchten Sie sich an eine Cypher-Abfrage halten, die in einem Ruby-Heredoc definiert ist.

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]]') 

Sie müssen die break dort die match Klauseln aus Gruppierung zu halten, obwohl das wegen einer Designentscheidung, die ich haben wollte für eine Weile jetzt umkehren.

Auch denke ich, dass es eine with_distinct Methode geben sollte, weil DISTINCT (IIRC) gilt für die ganze Reihe von Spalten.

+0

Vielen Dank für Ihre Hilfe, ich habe eine Menge von Ihnen gelernt zu beantworten –

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

können Sie mir bitte sagen, wie man es im ORM-Stil auch '.match() schreibt. Where() etc'? –

+0

Auch in meiner Abfrage gibt es Übereinstimmung geschrieben nach 'wo nicht ', alle zusammengestellten Aussagen gruppiert zuerst, dann wo, mit usw.? –

+1

Sie sollten auf jeden Fall geeignete 'WHERE'-Klauseln mit den' MATCH'-Klauseln gruppieren, die die Variablen definieren. Eine Sache, die ich nicht glaube, wird allgemein verstanden ist, dass 'WHERE' wirklich ein Modifikator für' MATCH' ist, nicht seine eigene Klausel –