3.2数据操作
3.2.1一般功能
对数据库的操作无非就是插入,更新,删除和查询, 其中最重要的就是查询了.
3.2.1.1查询
3.2.1.1.1普通查询
基本上与常见的ORM工具提供的查询语言(hibernate的HQL或)没有什么区别,一般Select 语句能支持的都支持,在这里我就不再说了。具体的设计将在概要设计中定义.
注意我们不要开发一个像HQL那样的查询语言,而是应该用一个SQL语句的抽象类库来生成数据库的原生SQL语句。
3.2.1.1.2图查询
这里就是与其他ORM工具提供的查询语言(hibernate的HQL)不同的地方了,它提供了完整的图查询操作。
在设计一个图查询之前我们想象一下我们对一个图进行查询对有什么样子的需求呢
1.从一点或n点出发,走指定的条件的线路,找出所有可到达的所有端点和线路
2.从一点或n点出发,走任意线路,找出所有可到达的所有端点和线路,但这些端点必须符合指定的条件。
3.从一点或n点出发,走指定的条件的线路,找出所有可到达的所有端点和线路,但这些端点必须符合指定的条件。
4.以上三个反过来,反过来查起始端点
因此我们将图查询设计为由三部分组成,源条目过滤表达式,目标条目过滤表达式和关系过滤表达式。其中源条目过滤表达式和目标条目过滤表达式在格式上完全相同,我们称之为条目过滤表达式(itemFilter),而关系过滤表达式(relationshipFilter)则稍有不同,它是在条目过滤表达式的基础上增加了一个遍历深度参数,你可以认为关系过滤表达式(relationshipFilter)是条目过滤表达式(itemFilter)的派生类。
其中源条目过滤表达式,目标条目过滤表达式是可选的,但不能相同两个都没有。
条目过滤表达式(itemFilter)
一个条目(item)匹配一个itemFilter当且仅当下列规定所有都为真时:
1.该条目符合定义在itemFilter中的约束。
2.当它作为源条目过滤表达式时,都有一个匹配 relationshipFilter 并将此条目(item)作为源的关系。
3.当它作为目标条目过滤表达式时,都有一个匹配 relationshipFilter 并将此条目(item)作为目标的关系。
虽然关系也是一个条目,但条目过滤表达式(itemFilter)不会返回关系实例。
关系过滤表达式(relationshipFilter)
一个关系匹配relationshipFilter当且仅当下列规定所有都为真:
符合 relationshipFilter中的约束的关系。如果源条目到目标条目之间要经过多个端点时,我们可能需要增加一个针对中间端点的itemFilter。
关系的源条目(item)匹配源条目过滤表达式。
关系的目标条目(item)匹配目标条目过滤表达式。
图中源条目和目标条目之间的边的数量满足指定的条件。
没有一个源或目标的关系,不能匹配relationshipFilter。
通过这三个部分的组合,基本上可以达到上面提到的要求了,便几点需要注意:
1.一个图中可能会有一个环,用户无需关心,实现本文的实现应该自己处理
2.因为图查询其实是一个递归操作,因此需要对递归的深度进行限制。
3.一个端点可能会有多个到达另一个端点的路径,只要这些路径符合relationshipFilter,那么它们就应该出现在结果中。
出处:博客园
责任编辑:bluehearts
上一页 GraphDatabase在关系数据库中的实现 [4] 下一页 GraphDatabase在关系数据库中的实现 [6]
◎进入论坛网络编程版块参加讨论
|