Neo4j.rb如何运行Cypher直接查询?
Neo4j.rb How to run Cypher query directly?
我想 运行 直接在 rails 中进行 Cypher 查询,不想使用 ORM 样式,因为我在 neo4j 控制台上进行了很长的查询,当我试图更改为 orm 时样式不符合预期
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 等
有帮助吗?
编辑:如何以 ORM 样式编写它可能是我做错了什么?
Neo4j::ActiveBase.current_session.query(cypher_query_string)
这是评论中要求的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]]')
你需要那里的 break
来防止 match
子句分组,尽管那是因为我想推翻一段时间的设计决定。
此外,我认为应该有一个 with_distinct
方法,因为 DISTINCT
(IIRC) 适用于整组列。
我想 运行 直接在 rails 中进行 Cypher 查询,不想使用 ORM 样式,因为我在 neo4j 控制台上进行了很长的查询,当我试图更改为 orm 时样式不符合预期
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 等
有帮助吗?
编辑:如何以 ORM 样式编写它可能是我做错了什么?
Neo4j::ActiveBase.current_session.query(cypher_query_string)
这是评论中要求的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]]')
你需要那里的 break
来防止 match
子句分组,尽管那是因为我想推翻一段时间的设计决定。
此外,我认为应该有一个 with_distinct
方法,因为 DISTINCT
(IIRC) 适用于整组列。