Могу ли я вернуть связь в виде поля внутри узла?

#graph #neo4j #cypher

#График #neo4j #шифр

Вопрос:

В настоящее время у меня есть этот запрос:

 OPTIONAL MATCH (t)<-[r:CHILD_OF]-(t1:Thing)<-[:TAGGED]-(post:Post)
 

и позже у меня есть

 OPTIONAL MATCH (this)<-[:TAGGED]-(post:Post)
 

и поскольку все они возвращаются вместе (в виде списка сообщений), я не знаю, какие сообщения были дочерними элементами вещи, а какие просто помечены «this» напрямую.

Возможно ли вернуть, когда здесь присутствует «r», который является именем переменной связи «CHILD_OF»?

Полный пост выглядит примерно так:

 OPTIONAL MATCH (this)<-[:CHILD_OF]-(t1:Thing)<-[:TAGGED]-(post:Post)
WITH COLLECT(post) as rows, this
OPTIONAL MATCH (this)<-[:TAGGED]-(p:Post)
WITH rows   COLLECT(p) as allRows
UNWIND allRows as post
RETURN DISTINCT post
ORDER BY post.date DESC
 

Я не хочу, чтобы это было как карта, поскольку neo4j-graphql-js этого не поддерживает, они поддерживают исключительно возврат отдельных узлов. Поэтому я также не могу выполнить return post, r

 type Thing {
    id: ID!,
    name: String,
    description: String,
    image: String,
    followers: [User] @relation(name: "FOLLOWS", direction: "IN"),
    posts: [Post] @cypher(statement: """
        OPTIONAL MATCH (this)<-[:CHILD_OF]-(t1:Thing)<-[:TAGGED]-(post:Post)
        WITH COLLECT(post) as rows, this
        OPTIONAL MATCH (this)<-[:TAGGED]-(p:Post)
        WITH rows   COLLECT(p) as allRows
        UNWIND allRows as post
        RETURN DISTINCT post
        ORDER BY post.date DESC
    """)
   
}

type User {
    id: ID!,
    uid: String,
    name: String,
    email: String,
    bio: String,
    followers: [User] @relation(name: "FOLLOWS", direction: "OUT"),
    post_count: Int @cypher(statement: """
        MATCH (this)-[:WROTE]->(p:Post)
        RETURN count(p)
    """),
    homepage_posts: [Post] @cypher(statement: """
        OPTIONAL MATCH (this)-[r:FOLLOWS]->(something)-[:WROTE|TAGGED]-(post:Post)        
        WITH COLLECT(post) as rows
        OPTIONAL MATCH (this)-[:WROTE]->(post:Post)
        WITH rows   COLLECT(post) as allRows
        UNWIND allRows as post
        RETURN DISTINCT post
        ORDER BY post.date DESC
    """)
}

type Relationship {
    type: String
}

type Post {
    id: ID!,
    body: String,
    images: [String],
    date: DateTime,
    isRetweet: Boolean,
    rating: Float,
    relationship: Relationship,
    author: User @relation(name: "WROTE", direction: "IN"),
    things: [Thing] @relation(name: "TAGGED", direction: "OUT"),
    likes: [User] @cypher(statement: """
        MATCH (u:User)-[r:LIKES]->(this)
        RETURN u
    """),
}
 

Комментарии:

1. Neo4j-graphql-js поддерживает map? Вам нужно будет определить пользовательский тип, хотя, вероятно

2. Я не думаю, что вы можете вернуть карту, nei4j-graphql-js ожидает возврата узла, нет? Я что-то не так понимаю?

3. Основному запросу нужен узел, если вы хотите использовать «это» в подзапросах. Вы можете вернуть карту в подзапросах, если ее возвращаемый тип не имеет никаких подзапросов. Итак, основная причина, по которой вам нужен узел, заключается в подзапросах, иначе вы можете вернуть карту

4. Привет, Томас — я не понимаю, как это может выглядеть? Когда я попытался вернуть карту, это не сработало. Также, когда я пытался использовать виртуальный узел, он работал в браузере, но не в neo4j-graphql-js.

5. Кажется, я не могу вернуть узел и его связь таким образом, чтобы neo4j-graphql-js принял, должен ли он быть узлом? У вас есть какие-либо идеи? Заранее благодарю!