isage-middleware 0.1.0__py3-none-any.whl

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.

Potentially problematic release.


This version of isage-middleware might be problematic. Click here for more details.

Files changed (191) hide show
  1. isage_middleware-0.1.0.dist-info/METADATA +424 -0
  2. isage_middleware-0.1.0.dist-info/RECORD +191 -0
  3. isage_middleware-0.1.0.dist-info/WHEEL +5 -0
  4. isage_middleware-0.1.0.dist-info/top_level.txt +1 -0
  5. sage/__init__.py +2 -0
  6. sage/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  7. sage/__pycache__/__init__.cpython-311.pyc +0 -0
  8. sage/middleware/__init__.py +83 -0
  9. sage/middleware/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  10. sage/middleware/__pycache__/__init__.cpython-311.pyc +0 -0
  11. sage/middleware/api/__init__.py +22 -0
  12. sage/middleware/api/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  13. sage/middleware/api/__pycache__/__init__.cpython-311.pyc +0 -0
  14. sage/middleware/api/__pycache__/graph_api.cpython-311.opt-2.pyc +0 -0
  15. sage/middleware/api/__pycache__/graph_api.cpython-311.pyc +0 -0
  16. sage/middleware/api/__pycache__/kv_api.cpython-311.opt-2.pyc +0 -0
  17. sage/middleware/api/__pycache__/kv_api.cpython-311.pyc +0 -0
  18. sage/middleware/api/__pycache__/memory_api.cpython-311.opt-2.pyc +0 -0
  19. sage/middleware/api/__pycache__/memory_api.cpython-311.pyc +0 -0
  20. sage/middleware/api/__pycache__/vdb_api.cpython-311.opt-2.pyc +0 -0
  21. sage/middleware/api/__pycache__/vdb_api.cpython-311.pyc +0 -0
  22. sage/middleware/api/graph_api.py +74 -0
  23. sage/middleware/api/kv_api.py +45 -0
  24. sage/middleware/api/memory_api.py +64 -0
  25. sage/middleware/api/vdb_api.py +60 -0
  26. sage/middleware/enterprise/__init__.py +75 -0
  27. sage/middleware/enterprise/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  28. sage/middleware/enterprise/__pycache__/__init__.cpython-311.pyc +0 -0
  29. sage/middleware/enterprise/sage_db/__init__.py +132 -0
  30. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  31. sage/middleware/enterprise/sage_db/__pycache__/__init__.cpython-311.pyc +0 -0
  32. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  33. sage/middleware/enterprise/sage_db/__pycache__/sage_db.cpython-311.pyc +0 -0
  34. sage/middleware/enterprise/sage_db/python/__init__.py +7 -0
  35. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  36. sage/middleware/enterprise/sage_db/python/__pycache__/__init__.cpython-311.pyc +0 -0
  37. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.opt-2.pyc +0 -0
  38. sage/middleware/enterprise/sage_db/python/__pycache__/sage_db.cpython-311.pyc +0 -0
  39. sage/middleware/enterprise/sage_db/python/sage_db.py +44 -0
  40. sage/middleware/enterprise/sage_db/sage_db.py +395 -0
  41. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.opt-2.pyc +0 -0
  42. sage/middleware/enterprise/sage_db/tests/__pycache__/test_python.cpython-311.pyc +0 -0
  43. sage/middleware/enterprise/sage_db/tests/test_python.py +144 -0
  44. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.opt-2.pyc +0 -0
  45. sage/middleware/examples/__pycache__/api_usage_tutorial.cpython-311.pyc +0 -0
  46. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
  47. sage/middleware/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
  48. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.opt-2.pyc +0 -0
  49. sage/middleware/examples/__pycache__/microservices_demo.cpython-311.pyc +0 -0
  50. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.opt-2.pyc +0 -0
  51. sage/middleware/examples/__pycache__/microservices_integration_demo.cpython-311.pyc +0 -0
  52. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.opt-2.pyc +0 -0
  53. sage/middleware/examples/__pycache__/microservices_registration_demo.cpython-311.pyc +0 -0
  54. sage/middleware/examples/api_usage_tutorial.py +339 -0
  55. sage/middleware/examples/dag_microservices_demo.py +220 -0
  56. sage/middleware/examples/microservices_demo.py +0 -0
  57. sage/middleware/examples/microservices_integration_demo.py +373 -0
  58. sage/middleware/examples/microservices_registration_demo.py +144 -0
  59. sage/middleware/py.typed +2 -0
  60. sage/middleware/services/graph/__init__.py +8 -0
  61. sage/middleware/services/graph/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  62. sage/middleware/services/graph/__pycache__/__init__.cpython-311.pyc +0 -0
  63. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.opt-2.pyc +0 -0
  64. sage/middleware/services/graph/__pycache__/graph_index.cpython-311.pyc +0 -0
  65. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.opt-2.pyc +0 -0
  66. sage/middleware/services/graph/__pycache__/graph_service.cpython-311.pyc +0 -0
  67. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.opt-2.pyc +0 -0
  68. sage/middleware/services/graph/examples/__pycache__/graph_demo.cpython-311.pyc +0 -0
  69. sage/middleware/services/graph/examples/graph_demo.py +177 -0
  70. sage/middleware/services/graph/graph_index.py +194 -0
  71. sage/middleware/services/graph/graph_service.py +541 -0
  72. sage/middleware/services/graph/search_engine/__init__.py +0 -0
  73. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  74. sage/middleware/services/graph/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  75. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.opt-2.pyc +0 -0
  76. sage/middleware/services/graph/search_engine/__pycache__/base_graph_index.cpython-311.pyc +0 -0
  77. sage/middleware/services/graph/search_engine/base_graph_index.py +0 -0
  78. sage/middleware/services/kv/__init__.py +8 -0
  79. sage/middleware/services/kv/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  80. sage/middleware/services/kv/__pycache__/__init__.cpython-311.pyc +0 -0
  81. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.opt-2.pyc +0 -0
  82. sage/middleware/services/kv/__pycache__/kv_service.cpython-311.pyc +0 -0
  83. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.opt-2.pyc +0 -0
  84. sage/middleware/services/kv/examples/__pycache__/kv_demo.cpython-311.pyc +0 -0
  85. sage/middleware/services/kv/examples/kv_demo.py +213 -0
  86. sage/middleware/services/kv/kv_service.py +306 -0
  87. sage/middleware/services/kv/search_engine/__init__.py +0 -0
  88. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  89. sage/middleware/services/kv/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  90. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.opt-2.pyc +0 -0
  91. sage/middleware/services/kv/search_engine/__pycache__/base_kv_index.cpython-311.pyc +0 -0
  92. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.opt-2.pyc +0 -0
  93. sage/middleware/services/kv/search_engine/__pycache__/bm25s_index.cpython-311.pyc +0 -0
  94. sage/middleware/services/kv/search_engine/base_kv_index.py +75 -0
  95. sage/middleware/services/kv/search_engine/bm25s_index.py +238 -0
  96. sage/middleware/services/memory/__init__.py +12 -0
  97. sage/middleware/services/memory/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  98. sage/middleware/services/memory/__pycache__/__init__.cpython-311.pyc +0 -0
  99. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.opt-2.pyc +0 -0
  100. sage/middleware/services/memory/__pycache__/memory_service.cpython-311.pyc +0 -0
  101. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.opt-2.pyc +0 -0
  102. sage/middleware/services/memory/examples/__pycache__/dag_microservices_demo.cpython-311.pyc +0 -0
  103. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.opt-2.pyc +0 -0
  104. sage/middleware/services/memory/examples/__pycache__/memory_demo.cpython-311.pyc +0 -0
  105. sage/middleware/services/memory/examples/dag_microservices_demo.py +220 -0
  106. sage/middleware/services/memory/examples/memory_demo.py +490 -0
  107. sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.opt-2.pyc +0 -0
  108. sage/middleware/services/memory/memory_collection/__pycache__/base_collection.cpython-311.pyc +0 -0
  109. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.opt-2.pyc +0 -0
  110. sage/middleware/services/memory/memory_collection/__pycache__/graph_collection.cpython-311.pyc +0 -0
  111. sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.opt-2.pyc +0 -0
  112. sage/middleware/services/memory/memory_collection/__pycache__/kv_collection.cpython-311.pyc +0 -0
  113. sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.opt-2.pyc +0 -0
  114. sage/middleware/services/memory/memory_collection/__pycache__/vdb_collection.cpython-311.pyc +0 -0
  115. sage/middleware/services/memory/memory_collection/base_collection.py +0 -0
  116. sage/middleware/services/memory/memory_collection/graph_collection.py +0 -0
  117. sage/middleware/services/memory/memory_collection/kv_collection.py +0 -0
  118. sage/middleware/services/memory/memory_collection/vdb_collection.py +0 -0
  119. sage/middleware/services/memory/memory_service.py +474 -0
  120. sage/middleware/services/memory/utils/__init__.py +0 -0
  121. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  122. sage/middleware/services/memory/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  123. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.opt-2.pyc +0 -0
  124. sage/middleware/services/memory/utils/__pycache__/path_utils.cpython-311.pyc +0 -0
  125. sage/middleware/services/memory/utils/path_utils.py +0 -0
  126. sage/middleware/services/vdb/__init__.py +8 -0
  127. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  128. sage/middleware/services/vdb/__pycache__/__init__.cpython-311.pyc +0 -0
  129. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.opt-2.pyc +0 -0
  130. sage/middleware/services/vdb/__pycache__/vdb_service.cpython-311.pyc +0 -0
  131. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.opt-2.pyc +0 -0
  132. sage/middleware/services/vdb/examples/__pycache__/vdb_demo.cpython-311.pyc +0 -0
  133. sage/middleware/services/vdb/examples/vdb_demo.py +447 -0
  134. sage/middleware/services/vdb/search_engine/__init__.py +0 -0
  135. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  136. sage/middleware/services/vdb/search_engine/__pycache__/__init__.cpython-311.pyc +0 -0
  137. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.opt-2.pyc +0 -0
  138. sage/middleware/services/vdb/search_engine/__pycache__/base_vdb_index.cpython-311.pyc +0 -0
  139. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.opt-2.pyc +0 -0
  140. sage/middleware/services/vdb/search_engine/__pycache__/faiss_index.cpython-311.pyc +0 -0
  141. sage/middleware/services/vdb/search_engine/base_vdb_index.py +58 -0
  142. sage/middleware/services/vdb/search_engine/faiss_index.py +461 -0
  143. sage/middleware/services/vdb/vdb_service.py +433 -0
  144. sage/middleware/utils/__init__.py +5 -0
  145. sage/middleware/utils/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  146. sage/middleware/utils/__pycache__/__init__.cpython-311.pyc +0 -0
  147. sage/middleware/utils/embedding/__init__.py +35 -0
  148. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.opt-2.pyc +0 -0
  149. sage/middleware/utils/embedding/__pycache__/__init__.cpython-311.pyc +0 -0
  150. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.opt-2.pyc +0 -0
  151. sage/middleware/utils/embedding/__pycache__/_cohere.cpython-311.pyc +0 -0
  152. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.opt-2.pyc +0 -0
  153. sage/middleware/utils/embedding/__pycache__/bedrock.cpython-311.pyc +0 -0
  154. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.opt-2.pyc +0 -0
  155. sage/middleware/utils/embedding/__pycache__/embedding_api.cpython-311.pyc +0 -0
  156. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.opt-2.pyc +0 -0
  157. sage/middleware/utils/embedding/__pycache__/embedding_model.cpython-311.pyc +0 -0
  158. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.opt-2.pyc +0 -0
  159. sage/middleware/utils/embedding/__pycache__/hf.cpython-311.pyc +0 -0
  160. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.opt-2.pyc +0 -0
  161. sage/middleware/utils/embedding/__pycache__/instructor.cpython-311.pyc +0 -0
  162. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.opt-2.pyc +0 -0
  163. sage/middleware/utils/embedding/__pycache__/jina.cpython-311.pyc +0 -0
  164. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.opt-2.pyc +0 -0
  165. sage/middleware/utils/embedding/__pycache__/lollms.cpython-311.pyc +0 -0
  166. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.opt-2.pyc +0 -0
  167. sage/middleware/utils/embedding/__pycache__/mockembedder.cpython-311.pyc +0 -0
  168. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.opt-2.pyc +0 -0
  169. sage/middleware/utils/embedding/__pycache__/nvidia_openai.cpython-311.pyc +0 -0
  170. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.opt-2.pyc +0 -0
  171. sage/middleware/utils/embedding/__pycache__/ollama.cpython-311.pyc +0 -0
  172. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.opt-2.pyc +0 -0
  173. sage/middleware/utils/embedding/__pycache__/openai.cpython-311.pyc +0 -0
  174. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.opt-2.pyc +0 -0
  175. sage/middleware/utils/embedding/__pycache__/siliconcloud.cpython-311.pyc +0 -0
  176. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.opt-2.pyc +0 -0
  177. sage/middleware/utils/embedding/__pycache__/zhipu.cpython-311.pyc +0 -0
  178. sage/middleware/utils/embedding/_cohere.py +68 -0
  179. sage/middleware/utils/embedding/bedrock.py +174 -0
  180. sage/middleware/utils/embedding/embedding_api.py +12 -0
  181. sage/middleware/utils/embedding/embedding_model.py +150 -0
  182. sage/middleware/utils/embedding/hf.py +90 -0
  183. sage/middleware/utils/embedding/instructor.py +10 -0
  184. sage/middleware/utils/embedding/jina.py +115 -0
  185. sage/middleware/utils/embedding/lollms.py +100 -0
  186. sage/middleware/utils/embedding/mockembedder.py +46 -0
  187. sage/middleware/utils/embedding/nvidia_openai.py +97 -0
  188. sage/middleware/utils/embedding/ollama.py +97 -0
  189. sage/middleware/utils/embedding/openai.py +112 -0
  190. sage/middleware/utils/embedding/siliconcloud.py +133 -0
  191. sage/middleware/utils/embedding/zhipu.py +85 -0
@@ -0,0 +1,177 @@
1
+ """
2
+ Graph Service 使用示例
3
+ 展示如何使用Graph微服务进行知识图谱构建和查询
4
+ """
5
+ from sage.core.api.local_environment import LocalEnvironment
6
+ from sage.middleware.services.services.graph import create_graph_service_factory
7
+
8
+
9
+ def test_graph_service():
10
+ """测试Graph服务基本功能"""
11
+ print("🚀 Graph Service Demo")
12
+ print("=" * 50)
13
+
14
+ # 创建环境
15
+ env = LocalEnvironment("graph_service_demo")
16
+
17
+ # 注册Graph服务 - 内存后端
18
+ graph_factory = create_graph_service_factory(
19
+ service_name="demo_graph_service",
20
+ backend_type="memory",
21
+ max_nodes=10000,
22
+ max_relationships=50000
23
+ )
24
+ env.register_service("demo_graph_service", graph_factory)
25
+
26
+ print("✅ Graph Service registered with memory backend")
27
+ print(" - Max nodes: 10,000")
28
+ print(" - Max relationships: 50,000")
29
+
30
+ # 模拟知识图谱构建
31
+ print("\n📝 Knowledge Graph Operations Demo:")
32
+
33
+ # 创建实体节点
34
+ entities = [
35
+ {"id": "person_1", "labels": ["Person"], "properties": {"name": "Alice", "age": 30}},
36
+ {"id": "person_2", "labels": ["Person"], "properties": {"name": "Bob", "age": 25}},
37
+ {"id": "company_1", "labels": ["Company"], "properties": {"name": "TechCorp", "founded": 2010}},
38
+ {"id": "skill_1", "labels": ["Skill"], "properties": {"name": "Python", "category": "Programming"}},
39
+ {"id": "skill_2", "labels": ["Skill"], "properties": {"name": "AI", "category": "Technology"}}
40
+ ]
41
+
42
+ print(f" add_nodes({len(entities)} entities) -> ✅ Added 5 nodes")
43
+ for entity in entities:
44
+ print(f" - {entity['labels'][0]}: {entity['properties']['name']}")
45
+
46
+ # 创建关系
47
+ relationships = [
48
+ {"from_node": "person_1", "to_node": "company_1", "rel_type": "WORKS_AT", "properties": {"since": 2020}},
49
+ {"from_node": "person_2", "to_node": "company_1", "rel_type": "WORKS_AT", "properties": {"since": 2021}},
50
+ {"from_node": "person_1", "to_node": "skill_1", "rel_type": "HAS_SKILL", "properties": {"level": "Expert"}},
51
+ {"from_node": "person_1", "to_node": "skill_2", "rel_type": "HAS_SKILL", "properties": {"level": "Intermediate"}},
52
+ {"from_node": "person_2", "to_node": "skill_1", "rel_type": "HAS_SKILL", "properties": {"level": "Beginner"}},
53
+ {"from_node": "person_1", "to_node": "person_2", "rel_type": "COLLEAGUE", "properties": {"since": 2021}}
54
+ ]
55
+
56
+ print(f" add_relationships({len(relationships)} relations) -> ✅ Added 6 relationships")
57
+ for rel in relationships:
58
+ print(f" - {rel['from_node']} --[{rel['rel_type']}]--> {rel['to_node']}")
59
+
60
+ # 图查询示例
61
+ print("\n🔍 Graph Query Examples:")
62
+
63
+ queries = [
64
+ {
65
+ "name": "查找Alice的同事",
66
+ "description": "MATCH (alice:Person {name: 'Alice'})-[:COLLEAGUE]->(colleague) RETURN colleague",
67
+ "result": "Bob"
68
+ },
69
+ {
70
+ "name": "查找TechCorp的员工",
71
+ "description": "MATCH (person:Person)-[:WORKS_AT]->(company:Company {name: 'TechCorp'}) RETURN person",
72
+ "result": "Alice, Bob"
73
+ },
74
+ {
75
+ "name": "查找Python专家",
76
+ "description": "MATCH (person:Person)-[r:HAS_SKILL]->(skill:Skill {name: 'Python'}) WHERE r.level = 'Expert' RETURN person",
77
+ "result": "Alice"
78
+ },
79
+ {
80
+ "name": "查找Alice的技能图谱",
81
+ "description": "MATCH (alice:Person {name: 'Alice'})-[:HAS_SKILL]->(skill:Skill) RETURN skill",
82
+ "result": "Python (Expert), AI (Intermediate)"
83
+ }
84
+ ]
85
+
86
+ for query in queries:
87
+ print(f" 📊 {query['name']}:")
88
+ print(f" Query: {query['description']}")
89
+ print(f" Result: {query['result']}")
90
+
91
+ print("\n💡 Graph Service Features:")
92
+ print(" - 知识图谱构建和管理")
93
+ print(" - 复杂图查询")
94
+ print(" - 图算法 (路径查找、社区发现)")
95
+ print(" - 实体关系推理")
96
+ print(" - 图可视化支持")
97
+
98
+
99
+ def test_graph_algorithms():
100
+ """演示图算法功能"""
101
+ print("\n🧮 Graph Algorithms:")
102
+
103
+ algorithms = [
104
+ {
105
+ "name": "最短路径",
106
+ "function": "shortest_path(person_1, person_2)",
107
+ "description": "查找两个实体间的最短关系路径",
108
+ "result": "person_1 -> company_1 <- person_2"
109
+ },
110
+ {
111
+ "name": "邻居发现",
112
+ "function": "get_neighbors(person_1, depth=2)",
113
+ "description": "查找指定深度内的所有相关实体",
114
+ "result": "company_1, skill_1, skill_2, person_2"
115
+ },
116
+ {
117
+ "name": "社区检测",
118
+ "function": "detect_communities()",
119
+ "description": "发现图中的紧密连接社区",
120
+ "result": "Community 1: [person_1, person_2, company_1]"
121
+ },
122
+ {
123
+ "name": "中心性分析",
124
+ "function": "centrality_analysis()",
125
+ "description": "分析节点在图中的重要性",
126
+ "result": "company_1: highest centrality (连接最多)"
127
+ }
128
+ ]
129
+
130
+ for algo in algorithms:
131
+ print(f" 🔄 {algo['name']}: {algo['description']}")
132
+ print(f" 调用: {algo['function']}")
133
+ print(f" 结果: {algo['result']}")
134
+
135
+
136
+ def test_graph_applications():
137
+ """演示Graph服务的应用场景"""
138
+ print("\n🎯 Graph Service Applications:")
139
+
140
+ applications = [
141
+ {
142
+ "name": "推荐系统",
143
+ "scenario": "基于用户-物品-属性图进行协同过滤推荐",
144
+ "entities": ["User", "Item", "Category", "Tag"],
145
+ "relationships": ["LIKES", "BELONGS_TO", "HAS_TAG", "SIMILAR_TO"]
146
+ },
147
+ {
148
+ "name": "知识问答",
149
+ "scenario": "构建领域知识图谱,支持复杂问答推理",
150
+ "entities": ["Concept", "Entity", "Relation", "Attribute"],
151
+ "relationships": ["IS_A", "PART_OF", "RELATED_TO", "HAS_PROPERTY"]
152
+ },
153
+ {
154
+ "name": "社交网络分析",
155
+ "scenario": "分析用户关系,发现社区和影响者",
156
+ "entities": ["User", "Post", "Topic", "Event"],
157
+ "relationships": ["FOLLOWS", "POSTS", "MENTIONS", "ATTENDS"]
158
+ },
159
+ {
160
+ "name": "欺诈检测",
161
+ "scenario": "通过异常图模式检测可疑行为",
162
+ "entities": ["Account", "Transaction", "Device", "Location"],
163
+ "relationships": ["TRANSFERS", "USES", "LOCATED_AT", "LINKED_TO"]
164
+ }
165
+ ]
166
+
167
+ for app in applications:
168
+ print(f" 📈 {app['name']}: {app['scenario']}")
169
+ print(f" 实体类型: {', '.join(app['entities'])}")
170
+ print(f" 关系类型: {', '.join(app['relationships'])}")
171
+
172
+
173
+ if __name__ == "__main__":
174
+ test_graph_service()
175
+ test_graph_algorithms()
176
+ test_graph_applications()
177
+ print("\n🎯 Graph Service demo completed!")
@@ -0,0 +1,194 @@
1
+ import collections
2
+ import uuid
3
+ import networkx as nx
4
+ import matplotlib.pyplot as plt
5
+ #from sage_memory.search_engine.graph_index.base_graph_index import BaseGraphIndex
6
+
7
+ class KnowledgeGraphIndex():
8
+ """
9
+ Simple knowledge graph storage.
10
+ 基于图的知识存储器。
11
+ """
12
+
13
+ def __init__(self):
14
+ # 初始化成员变量
15
+ self.qid2name = collections.defaultdict(str) # QID ---> entity name
16
+ self.triples = collections.defaultdict(set) # (head, rel) ---> set(tail, sentence)
17
+ self.qid_relations = collections.defaultdict(set) # QID ---> set(rel)
18
+
19
+ def construct_graph(self, batch):
20
+ """
21
+ 从批次数据中构建知识图谱
22
+ 输入格式: batch = [["head", "relation", "tail"], ...]
23
+ """
24
+ for head, relation, tail in batch:
25
+ # 构造三元组的句子
26
+ sentence = f"{head} --[{relation}]--> {tail}"
27
+ # 插入三元组
28
+ self.insert_edge(head, relation, tail, sentence)
29
+
30
+ def insert_edge(self, head, relation, tail, sentence):
31
+ """
32
+ 插入一条新的边 (head, relation, tail)
33
+ """
34
+ head_id=uuid.uuid5(uuid.NAMESPACE_DNS, head)
35
+ tail_id=uuid.uuid5(uuid.NAMESPACE_DNS, tail)
36
+
37
+ # 添加 head 和 tail 的名称映射
38
+ if head_id not in self.qid2name:
39
+ self.qid2name[head_id] = head
40
+ if tail_id not in self.qid2name:
41
+ self.qid2name[tail_id] = tail
42
+
43
+ # 检查 triples 中是否已存在该三元组
44
+ if (tail_id, sentence) not in self.triples[(head_id, relation)]:
45
+ self.triples[(head_id, relation)].add((tail_id, sentence))
46
+
47
+ # 检查 qid_relations 中是否已存在该关系
48
+ if relation not in self.qid_relations[head_id]:
49
+ self.qid_relations[head_id].add(relation)
50
+
51
+
52
+ def delete_edge(self, head, relation, tail):
53
+ """
54
+ 删除知识图谱中的一条边 (head, relation, tail)
55
+ """
56
+ # 生成唯一的 ID
57
+ head_id = uuid.uuid5(uuid.NAMESPACE_DNS, head)
58
+ tail_id = uuid.uuid5(uuid.NAMESPACE_DNS, tail)
59
+ # 从 triples 中删除对应的三元组
60
+ if (head_id, relation) in self.triples:
61
+ self.triples[(head_id, relation)] = {
62
+ t for t in self.triples[(head_id, relation)] if t[0] != tail_id
63
+ }
64
+ # 如果关系为空,则从 qid_relations 中移除
65
+ if not self.triples[(head_id, relation)]:
66
+ del self.triples[(head_id, relation)]
67
+ self.qid_relations[head_id].remove(relation)
68
+
69
+ def modify_edge(self, head, relation, tail, new_tail):
70
+ """
71
+ 修改知识图谱中的一条边 (head, relation, tail) 为 (head, relation, new_tail)
72
+ """
73
+ # 生成唯一的 ID
74
+ head_id = uuid.uuid5(uuid.NAMESPACE_DNS, head)
75
+ tail_id = uuid.uuid5(uuid.NAMESPACE_DNS, tail)
76
+ new_tail_id = uuid.uuid5(uuid.NAMESPACE_DNS, new_tail)
77
+
78
+ # 检查是否存在该关系
79
+ if (head_id, relation) in self.triples:
80
+ # 获取当前关系中的所有尾节点
81
+ current_tails = self.triples[(head_id, relation)]
82
+
83
+
84
+ # 检查是否存在指定的尾节点
85
+ tail_exists = False
86
+ for tail_id_in_graph, sentence in current_tails:
87
+ if tail_id_in_graph == tail_id:
88
+ tail_exists = True
89
+ # 修改尾节点为 new_tail
90
+ current_tails.remove((tail_id_in_graph, sentence))
91
+ new_sentence = f"{head} --[{relation}]--> {new_tail}"
92
+ current_tails.add((new_tail_id, new_sentence))
93
+ if new_tail_id not in self.qid2name:
94
+ self.qid2name[new_tail_id] = new_tail
95
+ break
96
+
97
+ if not tail_exists:
98
+ print(f"Edge ({head}, {relation}, {tail}) does not exist.")
99
+ return
100
+ else:
101
+ print(f"Relation ({head}, {relation}) does not exist in the graph.")
102
+
103
+
104
+ def clear_relation(self, head, relation):
105
+ head_id = uuid.uuid5(uuid.NAMESPACE_DNS, head)
106
+ if (head_id, relation) in self.triples:
107
+ del self.triples[(head_id, relation)]
108
+ self.qid_relations[head_id].remove(relation)
109
+
110
+ def get_neighbors(self, entity):
111
+ neighbors = set()
112
+ head_id = uuid.uuid5(uuid.NAMESPACE_DNS, entity)
113
+ for relation in self.qid_relations[head_id]:
114
+ for tail, _ in self.triples[(head_id, relation)]:
115
+ neighbors.add((relation, tail))
116
+ for relation, tail in neighbors:
117
+ print(f"Relation: {relation}, Tail: {self.qid2name[tail]}")
118
+ return neighbors
119
+
120
+
121
+ def print_graph(self):
122
+ """
123
+ 打印知识图谱的内容
124
+ """
125
+ print("Knowledge Graph:")
126
+ for (head_id, relation), tails in self.triples.items():
127
+ for tail_id, sentence in tails:
128
+ print(f"{self.qid2name[head_id]} --[{relation}]--> {self.qid2name[tail_id]}")
129
+
130
+
131
+ def visualize_knowledge_graph(self):
132
+ """
133
+ 可视化知识图谱
134
+ """
135
+ # 创建一个有向图
136
+ G = nx.DiGraph()
137
+
138
+ # 添加节点和边
139
+ for (head_id, relation), tails in self.triples.items(): # 使用 self 访问成员变量
140
+ head_name = self.qid2name[head_id]
141
+ for tail_id, sentence in tails:
142
+ tail_name = self.qid2name[tail_id]
143
+ G.add_edge(head_name, tail_name, label=relation)
144
+
145
+ # 绘制图形
146
+ pos = nx.spring_layout(G) # 使用 spring 布局
147
+ plt.figure(figsize=(12, 8))
148
+
149
+ # 绘制节点和边
150
+ nx.draw(G, pos, with_labels=True, node_size=3000, node_color="lightblue", font_size=10, font_weight="bold")
151
+
152
+ # 绘制边上的标签
153
+ edge_labels = nx.get_edge_attributes(G, 'label')
154
+ nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=8)
155
+
156
+ # 显示图形
157
+ plt.title("Knowledge Graph Visualization", fontsize=16)
158
+ plt.savefig("knowledge_graph.png") # 保存图形到文件
159
+
160
+ if __name__ == "__main__":
161
+ # 创建 KnowledgeGraphStorage 实例
162
+ kg_storage = KnowledgeGraphIndex()
163
+
164
+ # 定义测试数据
165
+ batch = [
166
+ ["Trump", "president_of", "USA"],
167
+ ["Trump", "fans_of", "CR7"],
168
+ ["Trump", "fans_of", "Mask"],
169
+ ["CR7", "rival_of", "Messi"],
170
+ ["CR7", "play_for", "Manchester United"],
171
+ ["CR7", "born_in", "Portugal"],
172
+ ["Manchester United", "located_in", "England"],
173
+ ]
174
+
175
+ # 构建知识图谱
176
+ kg_storage.construct_graph(batch)
177
+
178
+ # 打印知识图谱内容
179
+ print("测试输出:")
180
+ kg_storage.print_graph()
181
+ print()
182
+
183
+ print("CR7效力的球队发生了变化,需要修改知识图谱中的边:")
184
+ kg_storage.modify_edge("CR7", "play_for", "Manchester United", "Al-Nassr FC")
185
+ kg_storage.print_graph()
186
+ print()
187
+
188
+ print("Trump和Mask闹掰了,需要删除知识图谱中的边:")
189
+ kg_storage.delete_edge("Trump", "fans_of", "Mask")
190
+ kg_storage.print_graph()
191
+
192
+ kg_storage.get_neighbors("CR7")
193
+ # 可视化知识图谱
194
+ kg_storage.visualize_knowledge_graph()