Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Neo4j中组合查询?_Neo4j - Fatal编程技术网

如何在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(

我想用通用结构(很像GraphQL)来定义我的Neo4j查询并组合它们。 例如,下面是一个没有组合的简单查询:

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