当前位置: 首页 > news >正文

企业网站源码进一品资源网网站开发电脑配置

企业网站源码进一品资源网,网站开发电脑配置,不同类型网站比较及网站域名设计,个人网站不备案一、背景 在社交网络、知识图谱、推荐系统等领域#xff0c;常常需要处理 大规模、多跳、多属性的复杂关系网络。以社交网络为例#xff1a; 用户之间存在「单向或双向」的关注、好友关系。 常见的业务场景包括#xff1a;查找共同好友、N跳关系路径、基于属性筛选的路径…一、背景 在社交网络、知识图谱、推荐系统等领域常常需要处理 大规模、多跳、多属性的复杂关系网络。以社交网络为例 用户之间存在「单向或双向」的关注、好友关系。 常见的业务场景包括查找共同好友、N跳关系路径、基于属性筛选的路径分析等。 随着用户数量和关系数量增长传统关系型数据库在表示、维护及查询这些关系时将面临性能瓶颈。 我们可以把这些问题抽象为图问题 用户是节点顶点 关系是边 查询变成在图上找路径、多跳连接、筛选满足属性条件的节点 初始做法用关系型数据库模拟图 在没用图数据库前我们可能这么实现 一张 user 表存用户信息 一张 user_relation 表存用户关系from_id、to_id、type 多跳查询靠 BFS、DFS 遍历模拟 但是当数据规模上来比如几百万用户、上千万条关系多跳查询会非常慢因为每一跳都要在数据库里查产生大量随机 I/O。 扩展性问题也很明显 如果要加公司、城市等新类型实体 要改表结构还要改查询逻辑很难维护 图数据库就是为这种结构复杂、关系密集、查询灵活的问题设计的。 基本概念 名称含义图Graph实体 关系 构成的结构顶点Vertex也叫节点代表具体实体如“用户”、“城市”边Edge顶点之间的关系如“朋友”、“工作于”属性Property节点或边上的附加信息如“用户年龄”、“关系时间” 图数据库的两种存储模型 原生图Native Graph DB 底层就是用图结构存储比如 Neo4j 节点之间直接有引用指针 遍历节点时无需查索引Index-free adjacency 查询性能随子图规模线性增长而不是整个数据量 适合高频、多跳、实时的图计算场景。 非原生图Non-native 底层存的是其他数据库如关系型只是加了一层图语义支持比如 Apache TinkerPop 外部存储 查询效率不如原生图但接入简单、通用性好 Neo4j 简要介绍 Neo4j 是目前最广泛使用的图数据库之一特点是 原生图存储引擎 提供 Cypher 查询语言类 SQL很易上手 查询效率高尤其在多跳、多关系链场景表现优秀 提供 REST API 或嵌入式调用 Cypher 节点表示 节点使用圆括号 () 表示。 // 表示一个节点 (node) 添加标签类似关系型数据库中的表 // 带有 Person 标签的节点 (person:Person) 一个节点可以有多个标签 // 同时带有 Person 和 Employee 标签的节点 (person:Person:Employee) 关系可以有类型 // KNOWS 类型的关系 (person1:Person)-[:KNOWS]-(person2:Person) 节点和关系可以有属性属性使用大括号 {} 表示 // 带属性的节点 (person:Person {name: “张三”, age: 30}) ​ // 带属性的关系 (person1:Person)-[:KNOWS {since: 2015}]-(person2:Person) 一些常用示例 // 创建用户节点 CREATE (:User {name: Alice, age: 25}) // 如果需要引用这个节点可以给节点一个变量名 CREATE (u:User {name: Alice, age: 30}) // 创建关系 MATCH (a:User {name: Alice}), (b:User {name: Bob}) CREATE (a)-[:FRIEND {since: 2020}]-(b)// 查询 Alice 的所有朋友 MATCH (a:User {name: Alice})-[:FRIEND]-(friend) RETURN friend.name// 查询 Alice 的“朋友的朋友” MATCH (a:User {name: Alice})-[:FRIEND]-()-[:FRIEND]-(fof) RETURN DISTINCT fof.name//修改数据 // 修改 Bob 的年龄 MATCH (u:User {name: Bob}) SET u.age 35// 给 Charlie 增加城市属性 MATCH (u:User {name: Charlie}) SET u.city Beijing //删除数据 // 删除某个用户节点及其所有关系 MATCH (u:User {name: Alice}) DETACH DELETE u //创建带属性的复杂结构 // 创建用户、公司、工作关系 CREATE (u:User {name: Diana}) CREATE (c:Company {name: OpenAI}) CREATE (u)-[:WORKS_AT {role: Engineer, since: 2021}]-(c) //路径与最短路径查询// 查询 Alice 到 Charlie 的最短路径 MATCH (a:User {name: Alice}), (c:User {name: Charlie}), p shortestPath((a)-[*..5]-(c)) RETURN p //使用 WHERE 条件过滤 // 查询30岁以上的用户 MATCH (u:User) WHERE u.age 30 RETURN u.name, u.age// 查询工作在“OpenAI”的用户 MATCH (u:User)-[:WORKS_AT]-(c:Company {name: OpenAI}) RETURN u.name 底层结构 作为「原生图」模式的图数据库免索引邻接是实现高效查询性能的重要因素因此免索引邻接的实现机制就是neo4j 底层存储结构设计的关键。 在 neo4j 中点、关系和属性等组成元素的结构长度是固定的同时基于内部维护的ID进行访问。所以知道某点/关系/属性的ID就能计算得到在对应文件中的偏移位置直接进行访问。在遍历图时就省去了基于索引扫描的中间过程。 底层存储逻辑图包括节点label、关系、属性要素并通过指针维护关系 节点结构指向关系和属性的单向链表neostore.nodestore.db共15字节。 1bytes: 标志是否被使用、4bytes: 第一个关系ID、4bytes: 第一个属性ID、5bytes: 节点标签、1bytes: extra保留位 关系结构双向链表neostore.relationshipstore.db共34bytes 1bytes: 标志是否被使用、4bytes: 起始节点ID、4bytes:结束节点ID、4bytes: 关系类型、4bytes: 起始节点上个关系、4bytes: 起始节点下个关系、4bytes: 结束节点上个关系、4bytes: 结束节点下个关系 、4bytes: 第一个属性ID、1bytes: 是否为该起点和终点的第一个关系 属性结构单项链表neostore.propertystore.db属性结构同理 golang使用Neo4j go get github.com/neo4j/neo4j-go-driver/v5/neo4j package mainimport (contextfmtloggithub.com/neo4j/neo4j-go-driver/v5/neo4j )func main() {// 创建 driver 实例uri : neo4j://localhost:7687username : neo4jpassword : your_password // 请替换成你自己的密码// 连接数据库driver, err : neo4j.NewDriver(uri, neo4j.BasicAuth(username, password, ))if err ! nil {log.Fatal(创建 Neo4j driver 失败:, err)}defer driver.Close(context.Background())// 开始一个会话session : driver.NewSession(context.Background(), neo4j.SessionConfig{AccessMode: neo4j.AccessModeWrite,})defer session.Close(context.Background())// 执行 Cypher 创建节点_, err session.ExecuteWrite(context.Background(), func(tx neo4j.ManagedTransaction) (any, error) {_, err : tx.Run(context.Background(),CREATE (a:Person {name: $name, age: $age}) RETURN a,map[string]any{name: Alice,age: 30,})return nil, err})if err ! nil {log.Fatal(写入节点失败:, err)}fmt.Println(成功创建节点)// 执行查询result, err : session.ExecuteRead(context.Background(), func(tx neo4j.ManagedTransaction) (any, error) {res, err : tx.Run(context.Background(),MATCH (a:Person) RETURN a.name AS name, a.age AS age LIMIT 10,nil)if err ! nil {return nil, err}var results []map[string]anyfor res.Next(context.Background()) {record : res.Record()results append(results, map[string]any{name: record.Values[0],age: record.Values[1],})}return results, nil})if err ! nil {log.Fatal(查询失败:, err)}// 输出结果for _, r : range result.([]map[string]any) {fmt.Printf(Person: name%v, age%v\n, r[name], r[age])} } Java使用neo4j springdata-neo4j的实例 dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-neo4j/artifactId/dependency /dependencies application.yml: spring:neo4j:uri: bolt://localhost:7687authentication:username: neo4jpassword: your_password person.java: import org.springframework.data.neo4j.core.schema.*;import java.util.HashSet; import java.util.Set;Node public class Person {Id GeneratedValueprivate Long id;private String name;Relationship(type KNOWS, direction Relationship.Direction.OUTGOING)private SetPerson friends new HashSet();public Person() {}public Person(String name) {this.name name;}// getter 和 setter } repository: import org.springframework.data.neo4j.repository.Neo4jRepository;public interface PersonRepository extends Neo4jRepositoryPerson, Long {Person findByName(String name); } PersonService.java: import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;Service public class PersonService {private final PersonRepository personRepository;public PersonService(PersonRepository personRepository) {this.personRepository personRepository;}Transactionalpublic void createData() {Person alice new Person(Alice);Person bob new Person(Bob);alice.getFriends().add(bob);personRepository.save(alice); // 会级联保存 bob 和关系}public Person findByName(String name) {return personRepository.findByName(name);} } controller: import org.springframework.web.bind.annotation.*;RestController RequestMapping(/person) public class PersonController {private final PersonService personService;public PersonController(PersonService personService) {this.personService personService;}PostMapping(/init)public String init() {personService.createData();return ok;}GetMapping(/{name})public Person get(PathVariable String name) {return personService.findByName(name);} }
http://www.w-s-a.com/news/416747/

相关文章:

  • 网站建设58设计资料网站
  • 如何把动态图发网站做头像网页设计实训报告小结
  • 做简历用的网站wordpress版权说明
  • 网站关键词有哪些网站新闻前置审批
  • 怎么自己注册网站义乌做公司网站
  • 做哪种网站赚钱苏州住房城乡建设部网站
  • 镇江做网站学编程学哪一种比较好
  • 华美天一建筑公司网站赚钱做任务的网站有哪些
  • asp网站打开速度慢家乡网页设计教程
  • 网站 设计 深圳书店网站的建设
  • 北京网络营销推广培训哪家好南宁软件优化网站建设
  • flash网站引导页仓库管理系统源码
  • 济南网站制作公司排名营销型网站管理系统
  • 公司网站设计要多少钱用什么做网站的访问量统计
  • 湖北省住房和城乡建设厅门户网站沈阳网络平台推广公司
  • 河南平台网站建设公司网站如何提高转化率
  • 网站及推广wordpress 分享主题
  • 房产网站有哪些如何自己建一个微网站
  • 青岛市黄岛区城市建设局网站手机域名访问网站怎么进入
  • 网站模板 双语河南省建设人才信息网官网
  • 网站建设备案优化之看邹城网站开发
  • 网站方案书图书馆网站建设公司
  • 公司取名网免费版在线网站优化公司
  • dw怎么做秋季运动会网站九江集团网站建设
  • 响应式网站建设服务商wordpress 非小工具形式 微博秀
  • 网站安全检测漏洞扫描风险等级分布建设一个网站步骤
  • 摄影网站的意义开发企业小程序公司
  • 龙岩网站设计招聘信息网上免费logo设计
  • 高端定制网站开发建站教程详解网站共享备案可以申请支付接口
  • 做房产网站接不到电话企业推广宣传方式