graphene-django/GraphQLで実験を始めたばかりで、graphene-djangoのリレーライブラリについてはかなり混乱しています。クックブックのサンプル(自分のモデルで実装する)を実行し、テストクエリーを実行した後、POSTでは、エッジとノードを持つ奇妙なネストされたオブジェクトにクエリが変換されます。これらは何ですか?彼らは何をしていますか?Graphene-Django:接続、エッジ、ノードのコンセプト
答えて
{
companies {
edges {
node {
id
}
}
}
}
ノード
はNode
はFacebook Relay specs(GraphQLない仕様)の一部であることを言及する価値があるかもしれません。しかし、ほとんどのフレームワーク(Grapheneを含む)はRelayとGraphQLの密接な関連のためにこの仕様を実装しています。
本質的にNode
は、オブジェクトのグローバルに一意な識別子を意味するID
フィールドのみを実装するインターフェイスです。 ID
は不透明に設計されています(一般的な規則はbase64('type:id')
です)。アプリケーションはこの実装の詳細に頼るべきではありません。
Node
がルートクエリの一部として公開されています。アプリケーションは、便利な方法で、既知のID
のエンティティをクエリできます。フェッチされていないフィールドをフェッチする。
{
node(id: ID!) {
... on User {
id
userId
name
}
... on Company {
id
companyId
owner: {
userId
name
}
}
...
}
}
これは、あなたが(例えばmessage(messageId)
またはuser(userId)
)を公開するすべてのモデルのためのクエリ点を定義する必要がないの利便性を提供します。これはまた、例えば
{
user {
friends {
pages {
name
}
}
}
}
// vs
{
node(id) {
... on Page {
name
}
}
}
接続Node
同様
、あなたがオブジェクトの経路を通って横断することなく、オブジェクトを照会することができ、Connection
も主流の採用への道を作ったRelay specsの一部です。
edges
のコンセプトは一見したように余分に見えますが、使いにくいユースケースを解決します。通常、データベースに結合テーブルを実装して、「友人」のような多対多の関係を公開する必要性を考慮してください。
+---------+ +------------+
| users | | friends |
+---------+ +------------+
| user_id | <------ | left_id |
| .... | \--- | right_id |
+---------+ | created_at |
+------------+
エッジオブジェクト内friends.created_at
を露光することによって「[ここで日付]以降の友達」を表示するために今容易です。
{
user {
friends {
edges {
created_at <---
user {
id
userId
name
}
}
}
}
}
edges
本質的nodes
との間の関係を定義します。
+------+------+------------+--------+
| A_id | B_id | Created_at | Status |
+------+------+------------+--------+
はそれが正しいような表現edge
M2Mため言うことです:Atable
とBtable
マスト間
M2M関係は、少なくとも2つの外部キーを持たなければならない第3リンク(結合)テーブルABLink
によって実現されますデータベースのリンク(結合)テーブル? それでは、それは次のようになります:
{
Atable {
ABLink {
edges {
Created_at
Status
Btable {
Btable_id
Btable_column_1
Btable_column_2
...
}
}
}
}
}
- 1. 両エッジ接続と強く接続されたコンポーネントは同じコンセプトですか?
- 2. ノードに接続されたエッジの数と最大接続エッジを持つノードを見つける
- 3. graphvizとのノード/エッジ接続点のマーキング/ラベル付け
- 4. 検出エッジ(接続エッジ)およびエッジ長さ及び旋回
- 5. エッジの厚さによって表されるノード間の接続の頻度
- 6. Neo4j 150Mノードと100MエッジのためのCREATE接続が失われる
- 7. ArangoDB:エッジが他のエッジに接続されているトラバーサル
- 8. 直接deepstreamノードを接続
- 9. ノード+接続+ WebSocketを
- 10. ノードJSサーバー接続
- 11. Quickbooks接続エラー - ノード
- 12. Couchbase - ノード間の接続
- 13. ノードjsのソケット接続
- 14. ノードmysql接続プールのリリース
- 15. ノードJsでの接続タイムアウト
- 16. mongodb +ノード接続文字列
- 17. Graphviz - ノード間の水平エッジ
- 18. mxGraph画像ノードのエッジ
- 19. ノードjsの集約とfindoneコンセプト
- 20. ノードのamqplibとssl接続を接続する方法は?
- 21. 各エッジの8つの接続可能領域
- 22. ノードJSのソケット接続の制限
- 23. Apache 2つのノード間のIgnite接続
- 24. ノード4.1.2上のリクエストと接続
- 25. ノードがローカルホストのXmppサーバに接続
- 26. ノードの接続・フラッシュ表示メッセージパッシングデータ
- 27. ノードと非キープアライブ接続の方法
- 28. IIB - クライアントと統合ノードの接続
- 29. ノードJS Redisクライアント接続の再試行
- 30. 接続ノードの書き込みノードへの書き込み?
私はRelayにも慣れています。これは標準的な設定です。この説明はhttps:// facebookでチェックしてください。github.io/relay/graphql/connections.htm – t1m0
この質問が出てきたのは、フィルタリングのリレー依存関係がなくても、私たちのアプリケーション内でgraphene-djanoを使いたかったからです。私はここでリレーを使わずにフィルタリングを追加するテクニックを見つけることができました[リンク](https://github.com/graphql-python/graphene/issues/215) –
私はあなたが何を意味するかを見ます。あなたのリンクに書かれているように、リレーの規則を守ることの利点は、グラフェンがあなたにページングのためのあらかじめ構築されたセットアップを与えることです。 「pageInfo { hasNextPage hasPreviousPage startCursor endCursor }」というGraphQLクエリは自動的に動作します。 – t1m0