如何在Neo4j中组合查询?
我想用通用结构(很像GraphQL)来定义我的Neo4j查询并组合它们。 例如,下面是一个没有组合的简单查询:如何在Neo4j中组合查询?,neo4j,Neo4j,我想用通用结构(很像GraphQL)来定义我的Neo4j查询并组合它们。 例如,下面是一个没有组合的简单查询: chatrooms: { query: {limit: 10} fields: { id: true, name: true }} 我的Neo4j解释器可能如下所示: chatrooms = ({query, fields}) -> """ MATCH (c:CHATROOMS) RETURN #{R.join(' ', R.map(
chatrooms: {
query: {limit: 10}
fields: {
id: true,
name: true }}
我的Neo4j解释器可能如下所示:
chatrooms = ({query, fields}) ->
"""
MATCH (c:CHATROOMS)
RETURN #{R.join(' ', R.map(R.concat('c.'), R.keys(fields)))}
LIMIT #{query.limit}
"""
[
{id: 1, name:'neo4j', owner: {id: 99, name: 'michael'}}
{id: 2, name:'meteor', owner: {id: 100, name: 'chet'}}
]
但是,当我想编写更深入的嵌套查询时,我遇到了麻烦。
例如,如果我还想要一些关于每个聊天室所有者的信息,该怎么办?我不需要花费两个往返HTTP请求,而应该能够一次查询所有这些请求
chatrooms: {
query: {limit: 10}
fields: {
id: true,
name: true
owner: {
fields: {
id: true,
name: true}}}}
在这一点上,我有点挂断了。
我不知道如何使口译员足够通用来处理这些情况。
我知道查询应该是这样的
MATCH (c:CHATROOM)
MATCH (c)<-[:OWNS]-(u:USER)
RETURN c.id, c.name, u.id, u.name
LIMIT 10
这将使结果的组成和解释更加容易,但这是后面的细节
最后,我很难将这些查询嵌套得更深。
例如,如果我也希望每个聊天室都有一些消息呢?
如果我想知道每个聊天室的主人怎么办
chatrooms: {
query: {limit: 10}
fields: {
id: true,
name: true
owner: {
fields: {
id: true,
name: true}}
messages: {
query: {limit: 20}
fields: {
id: true,
text: true,
createdAt: true,
owner: {
fields: {
id: true,
name: true }}}}}}
这是我的做法——尽管我很确定这是完全错误的
MATCH (c:CHATROOM)
MATCH (c)<-[:OWNS]-(u:USER)
UNWIND c as room
MATCH (room)-[:OWNS]->(m:MESSAGE)
MATCH (m)<-[:OWNS]-(x:USER)
RETURN collect(m.id, m.text, m.creatdAt, x.id, x.name)
LIMIT 20
RETURN c.id, c.name, u.id, u.name,
LIMIT 10
匹配(c:聊天室)
匹配(c)(m:消息)
MATCH(m)首先,GraphQL的原理是使用嵌套结构
您应该使用引用
e、 g
为什么要在根对象上使用fields属性而不是fields?可以使用收集({key:value})
或{key:collect(value)
的序列和组合
住在这里:
要将这两行合并为一行,您可以使用WITH
,然后使用RETURN
,但这样您就无法获得数据流返回的好处
MATCH (c:CHATROOM)<-[:OWNS]-(u:USER)
WITH {id: c.id, name: c.name, owner: collect({id: u.id, name: u.name})} AS row
RETURN collect(row) as data
LIMIT 10
我希望字段递归嵌套。所有者字段取决于查询的上下文。我希望每个聊天室的所有者和每条消息的所有者。我事先不知道所有者ID、消息ID或聊天室ID,因为我希望在一个请求中完成这一切。我要使用的查询结构是{domain:{query,fields:{domain,…}}}
.1)通过流式传输返回数据是什么意思?您是在谈论使用java api还是rest api?2)如何在一个查询中获得嵌套消息?
MATCH (c:CHATROOM)<-[:OWNS]-(u:USER)
RETURN {id: c.id, name: c.name, owner: collect({id: u.id, name: u.name})} AS data
LIMIT 10
create (c:CHATROOM {id:1, name:"neo4j"})<-[:OWNS]-(u:USER {id:99,name:"Michael")
create (c:CHATROOM {id:2, name:"meteor"})<-[:OWNS]-(u:USER {id:100,name:"Chet")
+--------------------------------------------------------------------+
| data |
+--------------------------------------------------------------------+
| {id=2, name=meteor, owner=[{id=100, name=Chet}]} |
| {id=1, name=neo4j, owner=[{id=99, name=Michael}]} |
+--------------------------------------------------------------------+
MATCH (c:CHATROOM)<-[:OWNS]-(u:USER)
WITH {id: c.id, name: c.name, owner: collect({id: u.id, name: u.name})} AS row
RETURN collect(row) as data
LIMIT 10
MATCH (c:CHATROOM)<-[:OWNS]-(u:USER)
MATCH (c)-[:OWNS]->(m:MESSAGE)<-[:OWNS]-(x:USER)
WITH u,c,collect({id: m.id, text: m.text, created_at: m.createdAt, author_id: x.id, author: x.name}) as messages[0..20]
RETURN collect({ id: c.id, room: c.name,
owner_id: u.id, owner: u.name,
messages: messages}) as rooms
LIMIT 10