如何使用Neo4j GraphQL Library(三)

使用本地环境将上一节内容走一遍,做一次小总结

如何使用Neo4j GraphQL Library(二)
https://www.jianshu.com/p/4027668df850

1. 启动本地Neo4j Server

C:\Users\bing.yao>neo4j console

打开谷歌浏览器,本地访问Neo4j Browers
http://localhost:7474/browser/

2. 启动本地Apollo Server

参见:
如何使用Neo4j GraphQL Library(一)
https://www.jianshu.com/p/cabc3e54d808

先将Type(Book、Author等等)添加到index.js文件中;

const typeDefs = `
    type Order {
      orderID: ID! @id
      placedAt: DateTime @timestamp
      shippingCost: Float
      shipTo: Address @relationship(type: "SHIPS_TO", direction: OUT)
      customer: Customer @relationship(type: "PLACED", direction: IN)
      books: [Book] @relationship(type: "CONTAINS", direction: OUT)
    }

    type Customer {
      username: String
      orders: [Order] @relationship(type: "PLACED", direction: OUT)
      reviews: [Review] @relationship(type: "WROTE", direction: OUT)
    }

    type Address {
      address: String
      location: Point
      order: Order @relationship(type: "SHIPS_TO", direction: IN)
    }

    type Book {
      isbn: ID!
      title: String
      price: Float
      description: String
      reviews: [Review] @relationship(type: "REVIEWS", direction: IN)
      authors: [Author] @relationship(type: "AUTHOR_OF", direction: IN)
      subjects: [Subject] @relationship(type: "ABOUT", direction: OUT)
    }

    type Review {
      rating: Int
      text: String
      createdAt: DateTime @timestamp
      book: Book @relationship(type: "REVIEWS", direction: OUT)
      author: Customer @relationship(type: "WROTE", direction: IN)
    }

    type Author {
      name: String
      book: [Book] @relationship(type: "AUTHOR_OF", direction: OUT)
    }

    type Subject {
      name: String
      book: [Book] @relationship(type: "ABOUT", direction: IN)
    }
`;

然后启动Apollo。

C:\Users\bing.yao\course01>node index.js

打开谷歌浏览器,本地访问
http://localhost:4000/

3. 导入bookstore示例数据

playground

mutation {
  createBooks(
    input: [
      {
        isbn: "1492047686"
        title: "Graph Algorithms"
        price: 37.48
        description: "Practical Examples in Apache Spark and Neo4j"
      }
      {
        isbn: "1119387507"
        title: "Inspired"
        price: 21.38
        description: "How to Create Tech Products Customers Love"
      }
      {
        isbn: "190962151X"
        title: "Ross Poldark"
        price: 15.52
        description: "Ross Poldark is the first novel in Winston Graham's sweeping saga of Cornish life in the eighteenth century."
      }
    ]
  ) {
    books {
      title
    }
  }

  createCustomers(
    input: [
      {
        username: "EmilEifrem7474"
        reviews: {
          create: {
            rating: 5
            text: "Best overview of graph data science!"
            book: { connect: { where: { isbn: "1492047686" } } }
          }
        }
        orders: {
          create: {
            books: { connect: { where: { title: "Graph Algorithms" } } }
            shipTo: {
              create: {
                address: "111 E 5th Ave, San Mateo, CA 94401"
                location: {
                  latitude: 37.5635980790
                  longitude: -122.322243272725
                }
              }
            }
          }
        }
      }
      {
        username: "BookLover123"
        reviews: {
          create: [
            {
              rating: 4
              text: "Beautiful depiction of Cornwall."
              book: { connect: { where: { isbn: "190962151X" } } }
            }
          ]
        }
        orders: {
          create: {
            books: {
              connect: [
                { where: { title: "Ross Poldark" } }
                { where: { isbn: "1119387507" } }
                { where: { isbn: "1492047686" } }
              ]
            }
            shipTo: {
              create: {
                address: "Nordenskiöldsgatan 24, 211 19 Malmö, Sweden"
                location: { latitude: 55.6122270502, longitude: 12.99481772774 }
              }
            }
          }
        }
      }
    ]
  ) {
    customers {
      username
    }
  }
}
mutation {
  createAuthors(
    input: [
      {
      name: "Marty Cagan"
      book: { connect: { where: { title: "Inspired" } } }
        }
      {
      name: "Winston Graham"
      book: { connect: { where: { title: "Ross Poldark" } } }
        }
      {
      name: "Mark Needham"
      book: { connect: { where: { title: "Graph Algorithms" } } }
        }
      {
      name: "Amy E. Hodler"
      book: { connect: { where: { title: "Graph Algorithms" } } }
        }
    ]
  ) {
    authors {
      name
      book {
        title
      }
    }
  }
}
mutation {
  createSubjects(
    input: [
      {
      name: "Product management"
      book: { connect: { where: { title: "Inspired" } } }
        }
      {
      name: "Design"
      book: { connect: { where: { title: "Inspired" } } }
        }
      {
      name: "Historical fiction"
      book: { connect: { where: { title: "Ross Poldark" } } }
        }
      {
      name: "Cornwall"
      book: { connect: { where: { title: "Ross Poldark" } } }
        }
      {
      name: "Graph theory"
      book: { connect: { where: { title: "Graph Algorithms" } } }
        }
      {
      name: "Neo4j"
      book: { connect: { where: { title: "Graph Algorithms" } } }
        }
    ]
  ) {
    subjects {
      name
      book {
        title
      }
    }
  }
}

4. 查询数据

Graph Query 代码

{
  books{
    title
    price
    authors {
      name
    }
    reviews {
      rating
    }
    subjects {
      name
    }    
  }
}

返回信息

{
  "data": {
    "books": [
      {
        "title": "Graph Algorithms",
        "price": 37.48,
        "authors": [
          {
            "name": "Mark Needham"
          },
          {
            "name": "Amy E. Hodler"
          }
        ],
        "reviews": [
          {
            "rating": 5
          }
        ],
        "subjects": [
          {
            "name": "Neo4j"
          },
          {
            "name": "Graph theory"
          }
        ]
      },
      {
        "title": "Inspired",
        "price": 21.38,
        "authors": [
          {
            "name": "Marty Cagan"
          }
        ],
        "reviews": [],
        "subjects": [
          {
            "name": "Design"
          },
          {
            "name": "Product management"
          }
        ]
      },
      {
        "title": "Ross Poldark",
        "price": 15.52,
        "authors": [
          {
            "name": "Winston Graham"
          }
        ],
        "reviews": [
          {
            "rating": 4
          }
        ],
        "subjects": [
          {
            "name": "Cornwall"
          },
          {
            "name": "Historical fiction"
          }
        ]
      }
    ]
  }
}
zj01.JPG

在本地Neo4j Browers中输入Cypher查询书籍、作者、主题信息

match (a:Book),(b:Author),(c:Subject) return a,b,c
zj02.JPG

5. 对象或节点之间有关系就能查询吗?

下面代码是通过订单信息Order查询书籍Book信息,可以执行

{
  orders{
    orderID
    books {
      title
    }    
  }
}

下面代码是通过书籍Book信息查询订单信息Order,不能执行,错误提示:
GraphQLError: Cannot query field "orders" on type "Book".

{
  books{
    title
    orders {
      orderID
    }    
  }
}

原因是在Type Book中没有定义与Type Order的关系。
如果在Type Book中添加了与Order 的关系,则可以执行该代码:

orders: [Order] @relationship(type: "CONTAINS", direction: IN)

输出结果如下:

{
  "data": {
    "books": [
      {
        "title": "Graph Algorithms",
        "orders": [
          {
            "orderID": "da0ee3ee-2c21-4acd-9191-f161917fb512"
          },
          {
            "orderID": "b64b69c1-8373-4c35-a20c-f0b01fd7cd02"
          }
        ]
      },
      {
        "title": "Inspired",
        "orders": [
          {
            "orderID": "b64b69c1-8373-4c35-a20c-f0b01fd7cd02"
          }
        ]
      },
      {
        "title": "Ross Poldark",
        "orders": [
          {
            "orderID": "b64b69c1-8373-4c35-a20c-f0b01fd7cd02"
          }
        ]
      }
    ]
  }
}

基于GraphQL从一个节点(或称之为对象、Tpye)出发,是否能够查询出另一个节点的信息,需要看在该节点的Type中是否定义了指向另一个节点的关系@relationship。

6. 回顾用到的技术

1)Neo4j Graph Database Server,图数据库服务,用来存储图数据,可以通过Neo4j Browers执行Cypher代码来操作图数据。

2)Node.js,管理js库,提供js服务器端运行(即可以基于js提供web服务,js不只是写前端)

3)GraphQL,FB开源的一种用于API的查询语言,也是一种规范,同时也是一个运行环境

4)Neo4j GraphQL Library,js库,使得连接GraphQL和Neo4j Server更容易,更高效

5)Apollo Server,GraphQL后端服务集成,提供了Playground,通过浏览器输入GraphQL操作图数据

当我们需要基于图数据库开发Web应用,满足图数据的查询/修改等操作,以及数据展示。
整个项目可以分成三部分:
1)图数据
2)Web服务
3)前端数据展示和用户交互

图数据库,可以是Neo4j,也可以是其他的图数据库
Web服务,可以有更多的选择:Node.js+GraphQL+Apollo;Python+Flask;Java也可以
前端,jquery, bootstrap, d3.js,重点是能够以图的形式展示数据和交互

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容