@mytechtoday/augment-extensions 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -0
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -0
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/README.md +136 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/SCHEMA-VALIDATION-REPORT.md +216 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/brand-kit-example.yaml +292 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/campaign-brief-example.yaml +389 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/content-calendar-example.yaml +643 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/email-newsletter-example.md +376 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/landing-page-example.md +934 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/ppc-ad-copy-example.md +301 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/seo-blog-post-example.md +347 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/examples/social-media-campaign-example.md +606 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/module.json +50 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/affiliate-influencer-marketing.md +593 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/asset-management.md +418 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/brand-consistency.md +210 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/content-marketing.md +337 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/conversion-optimization.md +455 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/direct-sales.md +499 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/email-marketing.md +439 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/legal-compliance.md +227 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/ppc-advertising.md +569 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/seo-optimization.md +470 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/social-media-marketing.md +414 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/rules/universal-marketing.md +177 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/asset-inventory.schema.json +247 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/brand-kit.schema.json +326 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/campaign-brief.schema.json +342 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/color-palette.schema.json +223 -0
- package/augment-extensions/domain-rules/marketing-standards/seo-sales-marketing/schemas/content-template.schema.json +383 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -0
- package/augment-extensions/workflows/beads-integration/README.md +143 -0
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -0
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -0
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -0
- package/augment-extensions/workflows/beads-integration/module.json +75 -0
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -0
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -0
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -0
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/writing-standards/screenplay/README.md +300 -0
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -0
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -0
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -0
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -0
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -0
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -0
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -0
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -0
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -0
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -0
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -0
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -0
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -0
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -0
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -0
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -0
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -0
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -0
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -0
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -0
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -0
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -0
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -0
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -0
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -0
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -0
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -0
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -0
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -0
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -0
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -0
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -0
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -0
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -0
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -0
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -0
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -0
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -0
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -0
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -0
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -0
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +168 -10
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts +19 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +478 -63
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/types/gui.d.ts +62 -0
- package/cli/dist/types/gui.d.ts.map +1 -0
- package/cli/dist/types/gui.js +30 -0
- package/cli/dist/types/gui.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/gui-helpers.d.ts +23 -0
- package/cli/dist/utils/gui-helpers.d.ts.map +1 -0
- package/cli/dist/utils/gui-helpers.js +159 -0
- package/cli/dist/utils/gui-helpers.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +232 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +900 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +559 -105
- package/package.json +17 -6
|
@@ -0,0 +1,805 @@
|
|
|
1
|
+
# NoSQL Graph Database Example: Social Network
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This example demonstrates a complete social network application using Neo4j as a graph database. It covers node and relationship modeling, Cypher queries for friend recommendations, mutual friends, shortest path, and graph traversal patterns.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Application Requirements
|
|
10
|
+
|
|
11
|
+
**Features:**
|
|
12
|
+
- Users can create profiles
|
|
13
|
+
- Users can follow other users
|
|
14
|
+
- Users can create posts
|
|
15
|
+
- Users can like posts
|
|
16
|
+
- Users can comment on posts
|
|
17
|
+
- Users can join groups
|
|
18
|
+
- Users can tag other users in posts
|
|
19
|
+
|
|
20
|
+
**Query Patterns:**
|
|
21
|
+
- Find friends (mutual follows)
|
|
22
|
+
- Find followers and following
|
|
23
|
+
- Recommend users to follow (friends of friends)
|
|
24
|
+
- Find mutual friends
|
|
25
|
+
- Calculate shortest path between users
|
|
26
|
+
- Find popular users (most followers)
|
|
27
|
+
- Find posts from friends
|
|
28
|
+
- Find common interests (shared groups)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Graph Model
|
|
33
|
+
|
|
34
|
+
### Nodes
|
|
35
|
+
|
|
36
|
+
**User:**
|
|
37
|
+
```cypher
|
|
38
|
+
(:User {
|
|
39
|
+
id: "user123",
|
|
40
|
+
username: "alice_dev",
|
|
41
|
+
email: "alice@example.com",
|
|
42
|
+
full_name: "Alice Johnson",
|
|
43
|
+
bio: "Full-stack developer",
|
|
44
|
+
avatar_url: "https://cdn.example.com/avatars/alice.jpg",
|
|
45
|
+
location: "San Francisco, CA",
|
|
46
|
+
created_at: datetime("2024-01-15T10:00:00Z")
|
|
47
|
+
})
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Post:**
|
|
51
|
+
```cypher
|
|
52
|
+
(:Post {
|
|
53
|
+
id: "post456",
|
|
54
|
+
content: "Just learned about graph databases!",
|
|
55
|
+
created_at: datetime("2024-01-20T14:30:00Z")
|
|
56
|
+
})
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Group:**
|
|
60
|
+
```cypher
|
|
61
|
+
(:Group {
|
|
62
|
+
id: "group789",
|
|
63
|
+
name: "Graph Database Enthusiasts",
|
|
64
|
+
description: "A community for graph database lovers",
|
|
65
|
+
created_at: datetime("2024-01-10T09:00:00Z")
|
|
66
|
+
})
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
**Tag:**
|
|
70
|
+
```cypher
|
|
71
|
+
(:Tag {
|
|
72
|
+
name: "graphdb",
|
|
73
|
+
created_at: datetime("2024-01-01T00:00:00Z")
|
|
74
|
+
})
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Relationships
|
|
78
|
+
|
|
79
|
+
**FOLLOWS:**
|
|
80
|
+
```cypher
|
|
81
|
+
(alice:User)-[:FOLLOWS {since: date("2024-01-15")}]->(bob:User)
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**POSTED:**
|
|
85
|
+
```cypher
|
|
86
|
+
(alice:User)-[:POSTED {at: datetime("2024-01-20T14:30:00Z")}]->(post:Post)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**LIKES:**
|
|
90
|
+
```cypher
|
|
91
|
+
(alice:User)-[:LIKES {at: datetime("2024-01-20T15:00:00Z")}]->(post:Post)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**COMMENTED:**
|
|
95
|
+
```cypher
|
|
96
|
+
(alice:User)-[:COMMENTED {
|
|
97
|
+
content: "Great post!",
|
|
98
|
+
at: datetime("2024-01-20T15:30:00Z")
|
|
99
|
+
}]->(post:Post)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**MEMBER_OF:**
|
|
103
|
+
```cypher
|
|
104
|
+
(alice:User)-[:MEMBER_OF {
|
|
105
|
+
joined_at: date("2024-01-12"),
|
|
106
|
+
role: "member"
|
|
107
|
+
}]->(group:Group)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
**TAGGED:**
|
|
111
|
+
```cypher
|
|
112
|
+
(post:Post)-[:TAGGED]->(tag:Tag)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
**MENTIONS:**
|
|
116
|
+
```cypher
|
|
117
|
+
(post:Post)-[:MENTIONS]->(user:User)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Sample Data Creation
|
|
123
|
+
|
|
124
|
+
### Create Users
|
|
125
|
+
|
|
126
|
+
```cypher
|
|
127
|
+
// Create multiple users
|
|
128
|
+
CREATE (alice:User {
|
|
129
|
+
id: "user001",
|
|
130
|
+
username: "alice_dev",
|
|
131
|
+
email: "alice@example.com",
|
|
132
|
+
full_name: "Alice Johnson",
|
|
133
|
+
bio: "Full-stack developer passionate about graphs",
|
|
134
|
+
location: "San Francisco, CA",
|
|
135
|
+
created_at: datetime()
|
|
136
|
+
})
|
|
137
|
+
|
|
138
|
+
CREATE (bob:User {
|
|
139
|
+
id: "user002",
|
|
140
|
+
username: "bob_smith",
|
|
141
|
+
email: "bob@example.com",
|
|
142
|
+
full_name: "Bob Smith",
|
|
143
|
+
bio: "Data scientist and graph enthusiast",
|
|
144
|
+
location: "New York, NY",
|
|
145
|
+
created_at: datetime()
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
CREATE (charlie:User {
|
|
149
|
+
id: "user003",
|
|
150
|
+
username: "charlie_brown",
|
|
151
|
+
email: "charlie@example.com",
|
|
152
|
+
full_name: "Charlie Brown",
|
|
153
|
+
bio: "Software engineer learning Neo4j",
|
|
154
|
+
location: "Austin, TX",
|
|
155
|
+
created_at: datetime()
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
CREATE (diana:User {
|
|
159
|
+
id: "user004",
|
|
160
|
+
username: "diana_prince",
|
|
161
|
+
email: "diana@example.com",
|
|
162
|
+
full_name: "Diana Prince",
|
|
163
|
+
bio: "Graph database consultant",
|
|
164
|
+
location: "Seattle, WA",
|
|
165
|
+
created_at: datetime()
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
CREATE (eve:User {
|
|
169
|
+
id: "user005",
|
|
170
|
+
username: "eve_adams",
|
|
171
|
+
email: "eve@example.com",
|
|
172
|
+
full_name: "Eve Adams",
|
|
173
|
+
bio: "Backend developer",
|
|
174
|
+
location: "Boston, MA",
|
|
175
|
+
created_at: datetime()
|
|
176
|
+
})
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Create Relationships
|
|
180
|
+
|
|
181
|
+
```cypher
|
|
182
|
+
// Create follow relationships
|
|
183
|
+
MATCH (alice:User {username: "alice_dev"}), (bob:User {username: "bob_smith"})
|
|
184
|
+
CREATE (alice)-[:FOLLOWS {since: date("2024-01-15")}]->(bob)
|
|
185
|
+
|
|
186
|
+
MATCH (alice:User {username: "alice_dev"}), (charlie:User {username: "charlie_brown"})
|
|
187
|
+
CREATE (alice)-[:FOLLOWS {since: date("2024-01-16")}]->(charlie)
|
|
188
|
+
|
|
189
|
+
MATCH (bob:User {username: "bob_smith"}), (alice:User {username: "alice_dev"})
|
|
190
|
+
CREATE (bob)-[:FOLLOWS {since: date("2024-01-17")}]->(alice)
|
|
191
|
+
|
|
192
|
+
MATCH (bob:User {username: "bob_smith"}), (diana:User {username: "diana_prince"})
|
|
193
|
+
CREATE (bob)-[:FOLLOWS {since: date("2024-01-18")}]->(diana)
|
|
194
|
+
|
|
195
|
+
MATCH (charlie:User {username: "charlie_brown"}), (diana:User {username: "diana_prince"})
|
|
196
|
+
CREATE (charlie)-[:FOLLOWS {since: date("2024-01-19")}]->(diana)
|
|
197
|
+
|
|
198
|
+
MATCH (diana:User {username: "diana_prince"}), (eve:User {username: "eve_adams"})
|
|
199
|
+
CREATE (diana)-[:FOLLOWS {since: date("2024-01-20")}]->(eve)
|
|
200
|
+
|
|
201
|
+
MATCH (eve:User {username: "eve_adams"}), (alice:User {username: "alice_dev"})
|
|
202
|
+
CREATE (eve)-[:FOLLOWS {since: date("2024-01-21")}]->(alice)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### Create Posts and Interactions
|
|
206
|
+
|
|
207
|
+
```cypher
|
|
208
|
+
// Create posts
|
|
209
|
+
MATCH (alice:User {username: "alice_dev"})
|
|
210
|
+
CREATE (alice)-[:POSTED {at: datetime()}]->(post1:Post {
|
|
211
|
+
id: "post001",
|
|
212
|
+
content: "Just learned about graph databases! Mind = blown 🤯",
|
|
213
|
+
created_at: datetime()
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
MATCH (bob:User {username: "bob_smith"})
|
|
217
|
+
CREATE (bob)-[:POSTED {at: datetime()}]->(post2:Post {
|
|
218
|
+
id: "post002",
|
|
219
|
+
content: "Neo4j is amazing for social network queries",
|
|
220
|
+
created_at: datetime()
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
// Create likes
|
|
224
|
+
MATCH (bob:User {username: "bob_smith"}), (post1:Post {id: "post001"})
|
|
225
|
+
CREATE (bob)-[:LIKES {at: datetime()}]->(post1)
|
|
226
|
+
|
|
227
|
+
MATCH (charlie:User {username: "charlie_brown"}), (post1:Post {id: "post001"})
|
|
228
|
+
CREATE (charlie)-[:LIKES {at: datetime()}]->(post1)
|
|
229
|
+
|
|
230
|
+
// Create comments
|
|
231
|
+
MATCH (bob:User {username: "bob_smith"}), (post1:Post {id: "post001"})
|
|
232
|
+
CREATE (bob)-[:COMMENTED {
|
|
233
|
+
content: "Welcome to the graph world!",
|
|
234
|
+
at: datetime()
|
|
235
|
+
}]->(post1)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Create Groups
|
|
239
|
+
|
|
240
|
+
```cypher
|
|
241
|
+
// Create groups
|
|
242
|
+
CREATE (group1:Group {
|
|
243
|
+
id: "group001",
|
|
244
|
+
name: "Graph Database Enthusiasts",
|
|
245
|
+
description: "A community for graph database lovers",
|
|
246
|
+
created_at: datetime()
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
CREATE (group2:Group {
|
|
250
|
+
id: "group002",
|
|
251
|
+
name: "Neo4j Developers",
|
|
252
|
+
description: "Neo4j development best practices",
|
|
253
|
+
created_at: datetime()
|
|
254
|
+
})
|
|
255
|
+
|
|
256
|
+
// Add members to groups
|
|
257
|
+
MATCH (alice:User {username: "alice_dev"}), (group1:Group {id: "group001"})
|
|
258
|
+
CREATE (alice)-[:MEMBER_OF {joined_at: date(), role: "member"}]->(group1)
|
|
259
|
+
|
|
260
|
+
MATCH (bob:User {username: "bob_smith"}), (group1:Group {id: "group001"})
|
|
261
|
+
CREATE (bob)-[:MEMBER_OF {joined_at: date(), role: "admin"}]->(group1)
|
|
262
|
+
|
|
263
|
+
MATCH (charlie:User {username: "charlie_brown"}), (group1:Group {id: "group001"})
|
|
264
|
+
CREATE (charlie)-[:MEMBER_OF {joined_at: date(), role: "member"}]->(group1)
|
|
265
|
+
|
|
266
|
+
MATCH (alice:User {username: "alice_dev"}), (group2:Group {id: "group002"})
|
|
267
|
+
CREATE (alice)-[:MEMBER_OF {joined_at: date(), role: "member"}]->(group2)
|
|
268
|
+
|
|
269
|
+
MATCH (diana:User {username: "diana_prince"}), (group2:Group {id: "group002"})
|
|
270
|
+
CREATE (diana)-[:MEMBER_OF {joined_at: date(), role: "admin"}]->(group2)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Common Queries
|
|
276
|
+
|
|
277
|
+
### Query 1: Find Followers and Following
|
|
278
|
+
|
|
279
|
+
```cypher
|
|
280
|
+
// Find who Alice follows
|
|
281
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(following:User)
|
|
282
|
+
RETURN following.username, following.full_name
|
|
283
|
+
|
|
284
|
+
// Find Alice's followers
|
|
285
|
+
MATCH (follower:User)-[:FOLLOWS]->(alice:User {username: "alice_dev"})
|
|
286
|
+
RETURN follower.username, follower.full_name
|
|
287
|
+
|
|
288
|
+
// Count followers and following
|
|
289
|
+
MATCH (alice:User {username: "alice_dev"})
|
|
290
|
+
OPTIONAL MATCH (alice)-[:FOLLOWS]->(following)
|
|
291
|
+
OPTIONAL MATCH (follower)-[:FOLLOWS]->(alice)
|
|
292
|
+
RETURN
|
|
293
|
+
alice.username,
|
|
294
|
+
count(DISTINCT following) AS following_count,
|
|
295
|
+
count(DISTINCT follower) AS follower_count
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Query 2: Find Friends (Mutual Follows)
|
|
299
|
+
|
|
300
|
+
```cypher
|
|
301
|
+
// Find Alice's friends (users who follow each other)
|
|
302
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(alice)
|
|
303
|
+
RETURN friend.username, friend.full_name
|
|
304
|
+
|
|
305
|
+
// Find all mutual follow relationships
|
|
306
|
+
MATCH (a:User)-[:FOLLOWS]->(b:User)-[:FOLLOWS]->(a)
|
|
307
|
+
WHERE id(a) < id(b) // Avoid duplicates
|
|
308
|
+
RETURN a.username, b.username
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### Query 3: Recommend Users to Follow (Friends of Friends)
|
|
312
|
+
|
|
313
|
+
```cypher
|
|
314
|
+
// Recommend users to Alice (friends of friends not already following)
|
|
315
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend)-[:FOLLOWS]->(recommendation:User)
|
|
316
|
+
WHERE NOT (alice)-[:FOLLOWS]->(recommendation) // Not already following
|
|
317
|
+
AND recommendation <> alice // Not self
|
|
318
|
+
RETURN
|
|
319
|
+
recommendation.username,
|
|
320
|
+
recommendation.full_name,
|
|
321
|
+
count(DISTINCT friend) AS mutual_friends
|
|
322
|
+
ORDER BY mutual_friends DESC
|
|
323
|
+
LIMIT 10
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Query 4: Find Mutual Friends
|
|
327
|
+
|
|
328
|
+
```cypher
|
|
329
|
+
// Find mutual friends between Alice and Bob
|
|
330
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(mutual:User)<-[:FOLLOWS]-(bob:User {username: "bob_smith"})
|
|
331
|
+
RETURN mutual.username, mutual.full_name
|
|
332
|
+
|
|
333
|
+
// Count mutual friends
|
|
334
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(mutual:User)<-[:FOLLOWS]-(bob:User {username: "bob_smith"})
|
|
335
|
+
RETURN count(mutual) AS mutual_friend_count
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Query 5: Shortest Path Between Users
|
|
339
|
+
|
|
340
|
+
```cypher
|
|
341
|
+
// Find shortest path between Alice and Eve
|
|
342
|
+
MATCH path = shortestPath(
|
|
343
|
+
(alice:User {username: "alice_dev"})-[:FOLLOWS*]-(eve:User {username: "eve_adams"})
|
|
344
|
+
)
|
|
345
|
+
RETURN path, length(path) AS distance
|
|
346
|
+
|
|
347
|
+
// Find shortest path with direction (following only)
|
|
348
|
+
MATCH path = shortestPath(
|
|
349
|
+
(alice:User {username: "alice_dev"})-[:FOLLOWS*]->(eve:User {username: "eve_adams"})
|
|
350
|
+
)
|
|
351
|
+
RETURN path, length(path) AS hops
|
|
352
|
+
|
|
353
|
+
// Find all shortest paths
|
|
354
|
+
MATCH path = allShortestPaths(
|
|
355
|
+
(alice:User {username: "alice_dev"})-[:FOLLOWS*]-(eve:User {username: "eve_adams"})
|
|
356
|
+
)
|
|
357
|
+
RETURN path
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### Query 6: Find Popular Users (Most Followers)
|
|
361
|
+
|
|
362
|
+
```cypher
|
|
363
|
+
// Find users with most followers
|
|
364
|
+
MATCH (user:User)<-[:FOLLOWS]-(follower:User)
|
|
365
|
+
RETURN
|
|
366
|
+
user.username,
|
|
367
|
+
user.full_name,
|
|
368
|
+
count(follower) AS follower_count
|
|
369
|
+
ORDER BY follower_count DESC
|
|
370
|
+
LIMIT 10
|
|
371
|
+
|
|
372
|
+
// Find influential users (followers of followers)
|
|
373
|
+
MATCH (user:User)<-[:FOLLOWS]-(follower:User)<-[:FOLLOWS]-(fof:User)
|
|
374
|
+
RETURN
|
|
375
|
+
user.username,
|
|
376
|
+
count(DISTINCT fof) AS second_degree_followers
|
|
377
|
+
ORDER BY second_degree_followers DESC
|
|
378
|
+
LIMIT 10
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Query 7: Find Posts from Friends
|
|
382
|
+
|
|
383
|
+
```cypher
|
|
384
|
+
// Find recent posts from users Alice follows
|
|
385
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend:User)-[:POSTED]->(post:Post)
|
|
386
|
+
RETURN
|
|
387
|
+
friend.username,
|
|
388
|
+
post.content,
|
|
389
|
+
post.created_at
|
|
390
|
+
ORDER BY post.created_at DESC
|
|
391
|
+
LIMIT 20
|
|
392
|
+
|
|
393
|
+
// Include likes and comments count
|
|
394
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend:User)-[:POSTED]->(post:Post)
|
|
395
|
+
OPTIONAL MATCH (post)<-[:LIKES]-(liker:User)
|
|
396
|
+
OPTIONAL MATCH (post)<-[:COMMENTED]-(commenter:User)
|
|
397
|
+
RETURN
|
|
398
|
+
friend.username,
|
|
399
|
+
post.content,
|
|
400
|
+
post.created_at,
|
|
401
|
+
count(DISTINCT liker) AS like_count,
|
|
402
|
+
count(DISTINCT commenter) AS comment_count
|
|
403
|
+
ORDER BY post.created_at DESC
|
|
404
|
+
LIMIT 20
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Query 8: Find Common Interests (Shared Groups)
|
|
408
|
+
|
|
409
|
+
```cypher
|
|
410
|
+
// Find groups that both Alice and Bob are members of
|
|
411
|
+
MATCH (alice:User {username: "alice_dev"})-[:MEMBER_OF]->(group:Group)<-[:MEMBER_OF]-(bob:User {username: "bob_smith"})
|
|
412
|
+
RETURN group.name, group.description
|
|
413
|
+
|
|
414
|
+
// Find users with most shared groups with Alice
|
|
415
|
+
MATCH (alice:User {username: "alice_dev"})-[:MEMBER_OF]->(group:Group)<-[:MEMBER_OF]-(other:User)
|
|
416
|
+
WHERE other <> alice
|
|
417
|
+
RETURN
|
|
418
|
+
other.username,
|
|
419
|
+
other.full_name,
|
|
420
|
+
count(group) AS shared_groups
|
|
421
|
+
ORDER BY shared_groups DESC
|
|
422
|
+
LIMIT 10
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### Query 9: Find Users by Degree of Separation
|
|
426
|
+
|
|
427
|
+
```cypher
|
|
428
|
+
// Find all users within 2 degrees of Alice
|
|
429
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS*1..2]->(user:User)
|
|
430
|
+
RETURN DISTINCT user.username, user.full_name
|
|
431
|
+
|
|
432
|
+
// Find users at exactly 2 degrees of separation
|
|
433
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS*2]->(user:User)
|
|
434
|
+
WHERE NOT (alice)-[:FOLLOWS]->(user) // Not direct connection
|
|
435
|
+
AND user <> alice
|
|
436
|
+
RETURN DISTINCT user.username, user.full_name
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
### Query 10: Find Most Liked Posts
|
|
440
|
+
|
|
441
|
+
```cypher
|
|
442
|
+
// Find posts with most likes
|
|
443
|
+
MATCH (post:Post)<-[:LIKES]-(liker:User)
|
|
444
|
+
OPTIONAL MATCH (author:User)-[:POSTED]->(post)
|
|
445
|
+
RETURN
|
|
446
|
+
author.username,
|
|
447
|
+
post.content,
|
|
448
|
+
count(liker) AS like_count
|
|
449
|
+
ORDER BY like_count DESC
|
|
450
|
+
LIMIT 10
|
|
451
|
+
|
|
452
|
+
// Find posts liked by Alice's friends
|
|
453
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend:User)-[:LIKES]->(post:Post)
|
|
454
|
+
OPTIONAL MATCH (author:User)-[:POSTED]->(post)
|
|
455
|
+
RETURN
|
|
456
|
+
author.username,
|
|
457
|
+
post.content,
|
|
458
|
+
count(DISTINCT friend) AS friends_who_liked
|
|
459
|
+
ORDER BY friends_who_liked DESC
|
|
460
|
+
LIMIT 10
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Advanced Patterns
|
|
466
|
+
|
|
467
|
+
### Pattern 1: Friend Recommendations with Scoring
|
|
468
|
+
|
|
469
|
+
```cypher
|
|
470
|
+
// Recommend users with multiple scoring factors
|
|
471
|
+
MATCH (alice:User {username: "alice_dev"})
|
|
472
|
+
|
|
473
|
+
// Friends of friends
|
|
474
|
+
OPTIONAL MATCH (alice)-[:FOLLOWS]->(friend)-[:FOLLOWS]->(fof:User)
|
|
475
|
+
WHERE NOT (alice)-[:FOLLOWS]->(fof) AND fof <> alice
|
|
476
|
+
|
|
477
|
+
// Shared groups
|
|
478
|
+
OPTIONAL MATCH (alice)-[:MEMBER_OF]->(group:Group)<-[:MEMBER_OF]-(groupmate:User)
|
|
479
|
+
WHERE NOT (alice)-[:FOLLOWS]->(groupmate) AND groupmate <> alice
|
|
480
|
+
|
|
481
|
+
// Combine recommendations
|
|
482
|
+
WITH alice,
|
|
483
|
+
collect(DISTINCT fof) + collect(DISTINCT groupmate) AS recommendations
|
|
484
|
+
|
|
485
|
+
UNWIND recommendations AS rec
|
|
486
|
+
|
|
487
|
+
// Calculate score
|
|
488
|
+
MATCH (alice)-[:FOLLOWS]->(friend)-[:FOLLOWS]->(rec)
|
|
489
|
+
WITH rec, count(DISTINCT friend) AS mutual_friend_score
|
|
490
|
+
|
|
491
|
+
MATCH (alice)-[:MEMBER_OF]->(group:Group)<-[:MEMBER_OF]-(rec)
|
|
492
|
+
WITH rec, mutual_friend_score, count(group) AS shared_group_score
|
|
493
|
+
|
|
494
|
+
RETURN
|
|
495
|
+
rec.username,
|
|
496
|
+
rec.full_name,
|
|
497
|
+
mutual_friend_score,
|
|
498
|
+
shared_group_score,
|
|
499
|
+
(mutual_friend_score * 2 + shared_group_score) AS total_score
|
|
500
|
+
ORDER BY total_score DESC
|
|
501
|
+
LIMIT 10
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
### Pattern 2: Activity Feed with Relevance
|
|
505
|
+
|
|
506
|
+
```cypher
|
|
507
|
+
// Generate personalized activity feed for Alice
|
|
508
|
+
MATCH (alice:User {username: "alice_dev"})
|
|
509
|
+
|
|
510
|
+
// Posts from friends
|
|
511
|
+
MATCH (alice)-[:FOLLOWS]->(friend:User)-[:POSTED]->(post:Post)
|
|
512
|
+
|
|
513
|
+
// Calculate relevance score
|
|
514
|
+
OPTIONAL MATCH (post)<-[:LIKES]-(liker:User)
|
|
515
|
+
OPTIONAL MATCH (post)<-[:COMMENTED]-(commenter:User)
|
|
516
|
+
OPTIONAL MATCH (alice)-[:FOLLOWS]->(friend_who_liked:User)-[:LIKES]->(post)
|
|
517
|
+
|
|
518
|
+
WITH post, friend,
|
|
519
|
+
count(DISTINCT liker) AS like_count,
|
|
520
|
+
count(DISTINCT commenter) AS comment_count,
|
|
521
|
+
count(DISTINCT friend_who_liked) AS friends_who_liked
|
|
522
|
+
|
|
523
|
+
// Calculate recency score (newer = higher)
|
|
524
|
+
WITH post, friend, like_count, comment_count, friends_who_liked,
|
|
525
|
+
duration.between(post.created_at, datetime()).hours AS hours_old
|
|
526
|
+
|
|
527
|
+
RETURN
|
|
528
|
+
friend.username,
|
|
529
|
+
post.content,
|
|
530
|
+
post.created_at,
|
|
531
|
+
like_count,
|
|
532
|
+
comment_count,
|
|
533
|
+
friends_who_liked,
|
|
534
|
+
(like_count + comment_count * 2 + friends_who_liked * 3 - hours_old / 24.0) AS relevance_score
|
|
535
|
+
ORDER BY relevance_score DESC
|
|
536
|
+
LIMIT 20
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
### Pattern 3: Community Detection (Find Clusters)
|
|
540
|
+
|
|
541
|
+
```cypher
|
|
542
|
+
// Find tightly connected groups of users
|
|
543
|
+
MATCH (u1:User)-[:FOLLOWS]->(u2:User)-[:FOLLOWS]->(u3:User)-[:FOLLOWS]->(u1)
|
|
544
|
+
WHERE id(u1) < id(u2) AND id(u2) < id(u3)
|
|
545
|
+
RETURN u1.username, u2.username, u3.username
|
|
546
|
+
|
|
547
|
+
// Find users who are bridges between communities
|
|
548
|
+
MATCH (a:User)-[:FOLLOWS]->(bridge:User)-[:FOLLOWS]->(b:User)
|
|
549
|
+
WHERE NOT (a)-[:FOLLOWS]->(b)
|
|
550
|
+
WITH bridge, count(DISTINCT a) AS in_degree, count(DISTINCT b) AS out_degree
|
|
551
|
+
WHERE in_degree > 3 AND out_degree > 3
|
|
552
|
+
RETURN bridge.username, in_degree, out_degree
|
|
553
|
+
ORDER BY (in_degree + out_degree) DESC
|
|
554
|
+
```
|
|
555
|
+
|
|
556
|
+
### Pattern 4: Influence Propagation
|
|
557
|
+
|
|
558
|
+
```cypher
|
|
559
|
+
// Find how far Alice's posts can reach (viral potential)
|
|
560
|
+
MATCH (alice:User {username: "alice_dev"})-[:POSTED]->(post:Post)
|
|
561
|
+
MATCH (alice)<-[:FOLLOWS*1..3]-(reacher:User)
|
|
562
|
+
RETURN
|
|
563
|
+
post.content,
|
|
564
|
+
count(DISTINCT reacher) AS potential_reach
|
|
565
|
+
ORDER BY potential_reach DESC
|
|
566
|
+
|
|
567
|
+
// Find influencers (users whose posts reach many people)
|
|
568
|
+
MATCH (user:User)-[:POSTED]->(post:Post)
|
|
569
|
+
MATCH (user)<-[:FOLLOWS*1..2]-(reacher:User)
|
|
570
|
+
WITH user, count(DISTINCT reacher) AS reach
|
|
571
|
+
RETURN
|
|
572
|
+
user.username,
|
|
573
|
+
user.full_name,
|
|
574
|
+
reach
|
|
575
|
+
ORDER BY reach DESC
|
|
576
|
+
LIMIT 10
|
|
577
|
+
```
|
|
578
|
+
|
|
579
|
+
---
|
|
580
|
+
|
|
581
|
+
## Indexing and Constraints
|
|
582
|
+
|
|
583
|
+
### Create Indexes
|
|
584
|
+
|
|
585
|
+
```cypher
|
|
586
|
+
// Create unique constraint on username (creates index automatically)
|
|
587
|
+
CREATE CONSTRAINT user_username_unique FOR (u:User) REQUIRE u.username IS UNIQUE
|
|
588
|
+
|
|
589
|
+
// Create unique constraint on email
|
|
590
|
+
CREATE CONSTRAINT user_email_unique FOR (u:User) REQUIRE u.email IS UNIQUE
|
|
591
|
+
|
|
592
|
+
// Create index on user ID
|
|
593
|
+
CREATE INDEX user_id FOR (u:User) ON (u.id)
|
|
594
|
+
|
|
595
|
+
// Create index on post created_at
|
|
596
|
+
CREATE INDEX post_created_at FOR (p:Post) ON (p.created_at)
|
|
597
|
+
|
|
598
|
+
// Create index on group name
|
|
599
|
+
CREATE INDEX group_name FOR (g:Group) ON (g.name)
|
|
600
|
+
|
|
601
|
+
// Create composite index
|
|
602
|
+
CREATE INDEX user_location_created FOR (u:User) ON (u.location, u.created_at)
|
|
603
|
+
|
|
604
|
+
// Create full-text index
|
|
605
|
+
CREATE FULLTEXT INDEX user_search FOR (u:User) ON EACH [u.username, u.full_name, u.bio]
|
|
606
|
+
CREATE FULLTEXT INDEX post_search FOR (p:Post) ON EACH [p.content]
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
### Create Constraints
|
|
610
|
+
|
|
611
|
+
```cypher
|
|
612
|
+
// Ensure user has required properties
|
|
613
|
+
CREATE CONSTRAINT user_username_exists FOR (u:User) REQUIRE u.username IS NOT NULL
|
|
614
|
+
CREATE CONSTRAINT user_email_exists FOR (u:User) REQUIRE u.email IS NOT NULL
|
|
615
|
+
|
|
616
|
+
// Ensure post has required properties
|
|
617
|
+
CREATE CONSTRAINT post_content_exists FOR (p:Post) REQUIRE p.content IS NOT NULL
|
|
618
|
+
|
|
619
|
+
// Node key constraint (combination of unique and existence)
|
|
620
|
+
CREATE CONSTRAINT user_key FOR (u:User) REQUIRE (u.id) IS NODE KEY
|
|
621
|
+
```
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## Performance Optimization
|
|
626
|
+
|
|
627
|
+
### Query Optimization Tips
|
|
628
|
+
|
|
629
|
+
**Use PROFILE to analyze queries:**
|
|
630
|
+
```cypher
|
|
631
|
+
PROFILE
|
|
632
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend)-[:FOLLOWS]->(fof)
|
|
633
|
+
WHERE NOT (alice)-[:FOLLOWS]->(fof) AND fof <> alice
|
|
634
|
+
RETURN fof.username, count(*) AS mutual_friends
|
|
635
|
+
ORDER BY mutual_friends DESC
|
|
636
|
+
LIMIT 10
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
**Use EXPLAIN to see query plan:**
|
|
640
|
+
```cypher
|
|
641
|
+
EXPLAIN
|
|
642
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS]->(friend)
|
|
643
|
+
RETURN friend.username
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Limit traversal depth:**
|
|
647
|
+
```cypher
|
|
648
|
+
// ❌ BAD: Unbounded traversal
|
|
649
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS*]->(user)
|
|
650
|
+
RETURN user
|
|
651
|
+
|
|
652
|
+
// ✅ GOOD: Limited depth
|
|
653
|
+
MATCH (alice:User {username: "alice_dev"})-[:FOLLOWS*1..3]->(user)
|
|
654
|
+
RETURN user
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
**Use LIMIT early:**
|
|
658
|
+
```cypher
|
|
659
|
+
// ❌ BAD: Process all results then limit
|
|
660
|
+
MATCH (user:User)<-[:FOLLOWS]-(follower)
|
|
661
|
+
WITH user, count(follower) AS follower_count
|
|
662
|
+
ORDER BY follower_count DESC
|
|
663
|
+
LIMIT 10
|
|
664
|
+
RETURN user.username, follower_count
|
|
665
|
+
|
|
666
|
+
// ✅ GOOD: Limit early
|
|
667
|
+
MATCH (user:User)<-[:FOLLOWS]-(follower)
|
|
668
|
+
WITH user, count(follower) AS follower_count
|
|
669
|
+
ORDER BY follower_count DESC
|
|
670
|
+
LIMIT 10
|
|
671
|
+
RETURN user.username, follower_count
|
|
672
|
+
```
|
|
673
|
+
|
|
674
|
+
**Use indexes:**
|
|
675
|
+
```cypher
|
|
676
|
+
// ❌ BAD: No index, full scan
|
|
677
|
+
MATCH (u:User)
|
|
678
|
+
WHERE u.email = "alice@example.com"
|
|
679
|
+
RETURN u
|
|
680
|
+
|
|
681
|
+
// ✅ GOOD: Create index first
|
|
682
|
+
CREATE CONSTRAINT user_email_unique FOR (u:User) REQUIRE u.email IS UNIQUE
|
|
683
|
+
|
|
684
|
+
MATCH (u:User {email: "alice@example.com"})
|
|
685
|
+
RETURN u
|
|
686
|
+
```
|
|
687
|
+
|
|
688
|
+
---
|
|
689
|
+
|
|
690
|
+
## Graph Algorithms (Neo4j GDS)
|
|
691
|
+
|
|
692
|
+
### PageRank (Find Influential Users)
|
|
693
|
+
|
|
694
|
+
```cypher
|
|
695
|
+
// Create in-memory graph projection
|
|
696
|
+
CALL gds.graph.project(
|
|
697
|
+
'social-network',
|
|
698
|
+
'User',
|
|
699
|
+
'FOLLOWS'
|
|
700
|
+
)
|
|
701
|
+
|
|
702
|
+
// Run PageRank
|
|
703
|
+
CALL gds.pageRank.stream('social-network')
|
|
704
|
+
YIELD nodeId, score
|
|
705
|
+
RETURN gds.util.asNode(nodeId).username AS username, score
|
|
706
|
+
ORDER BY score DESC
|
|
707
|
+
LIMIT 10
|
|
708
|
+
|
|
709
|
+
// Write results back to database
|
|
710
|
+
CALL gds.pageRank.write('social-network', {
|
|
711
|
+
writeProperty: 'pagerank'
|
|
712
|
+
})
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Community Detection (Louvain)
|
|
716
|
+
|
|
717
|
+
```cypher
|
|
718
|
+
// Find communities
|
|
719
|
+
CALL gds.louvain.stream('social-network')
|
|
720
|
+
YIELD nodeId, communityId
|
|
721
|
+
RETURN
|
|
722
|
+
communityId,
|
|
723
|
+
collect(gds.util.asNode(nodeId).username) AS members
|
|
724
|
+
ORDER BY size(members) DESC
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
### Betweenness Centrality (Find Bridges)
|
|
728
|
+
|
|
729
|
+
```cypher
|
|
730
|
+
// Find users who connect different parts of the network
|
|
731
|
+
CALL gds.betweenness.stream('social-network')
|
|
732
|
+
YIELD nodeId, score
|
|
733
|
+
RETURN gds.util.asNode(nodeId).username AS username, score
|
|
734
|
+
ORDER BY score DESC
|
|
735
|
+
LIMIT 10
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
### Shortest Path (Dijkstra)
|
|
739
|
+
|
|
740
|
+
```cypher
|
|
741
|
+
// Find shortest path with weighted relationships
|
|
742
|
+
MATCH (alice:User {username: "alice_dev"}), (eve:User {username: "eve_adams"})
|
|
743
|
+
CALL gds.shortestPath.dijkstra.stream('social-network', {
|
|
744
|
+
sourceNode: id(alice),
|
|
745
|
+
targetNode: id(eve)
|
|
746
|
+
})
|
|
747
|
+
YIELD path, totalCost
|
|
748
|
+
RETURN path, totalCost
|
|
749
|
+
```
|
|
750
|
+
|
|
751
|
+
---
|
|
752
|
+
|
|
753
|
+
## Best Practices
|
|
754
|
+
|
|
755
|
+
### DO
|
|
756
|
+
|
|
757
|
+
✅ **Use meaningful relationship types** (FOLLOWS, LIKES, not RELATED_TO)
|
|
758
|
+
✅ **Create indexes on frequently queried properties** (username, email)
|
|
759
|
+
✅ **Limit traversal depth** to avoid performance issues
|
|
760
|
+
✅ **Use LIMIT** to restrict result sets
|
|
761
|
+
✅ **Profile queries** to identify bottlenecks
|
|
762
|
+
✅ **Use graph algorithms** for complex analysis (PageRank, community detection)
|
|
763
|
+
✅ **Implement constraints** for data integrity
|
|
764
|
+
✅ **Use parameters** to prevent Cypher injection
|
|
765
|
+
|
|
766
|
+
### DON'T
|
|
767
|
+
|
|
768
|
+
❌ **Don't create unbounded relationships** (limit followers, posts, etc.)
|
|
769
|
+
❌ **Don't store large binary data in nodes** (use external storage)
|
|
770
|
+
❌ **Don't traverse without depth limits** (can cause infinite loops)
|
|
771
|
+
❌ **Don't ignore indexes** (critical for performance)
|
|
772
|
+
❌ **Don't create too many relationship types** (keep it simple)
|
|
773
|
+
❌ **Don't use graphs for simple key-value lookups** (use key-value store instead)
|
|
774
|
+
|
|
775
|
+
---
|
|
776
|
+
|
|
777
|
+
## Summary
|
|
778
|
+
|
|
779
|
+
**Graph databases excel at:**
|
|
780
|
+
- Social network queries (friends, followers, recommendations)
|
|
781
|
+
- Relationship traversal (shortest path, degrees of separation)
|
|
782
|
+
- Pattern matching (mutual friends, common interests)
|
|
783
|
+
- Influence analysis (PageRank, centrality)
|
|
784
|
+
- Community detection (clusters, bridges)
|
|
785
|
+
|
|
786
|
+
**Key patterns demonstrated:**
|
|
787
|
+
- **Friend recommendations**: Friends of friends not already following
|
|
788
|
+
- **Mutual friends**: Users who follow each other
|
|
789
|
+
- **Shortest path**: Degrees of separation between users
|
|
790
|
+
- **Influence**: PageRank, follower count, reach
|
|
791
|
+
- **Activity feed**: Personalized content with relevance scoring
|
|
792
|
+
|
|
793
|
+
**Performance tips:**
|
|
794
|
+
- Create indexes on queried properties (username, email)
|
|
795
|
+
- Limit traversal depth (1..3 hops)
|
|
796
|
+
- Use LIMIT for large result sets
|
|
797
|
+
- Profile queries to identify bottlenecks
|
|
798
|
+
- Use graph algorithms for complex analysis (GDS library)
|
|
799
|
+
|
|
800
|
+
**Trade-offs:**
|
|
801
|
+
- **Embedding**: Fast reads, harder updates, bounded size
|
|
802
|
+
- **Referencing**: Flexible queries, slower reads (traversals), unbounded growth
|
|
803
|
+
- **Denormalization**: Store computed values (follower_count) for fast access
|
|
804
|
+
|
|
805
|
+
|