前端如何制作关系图_如何使用字符表示图关系?

作者:等你归去来

出处:https://www.cnblogs.com/yougewe/p/13865184.html

知识图谱听起来很高大上,而且也应用广泛。而图数据库,你可以到网上搜搜,基本就是像 neo4j, janusgraph, HugeGraph...

如果想让做个类似的图谱的东西,你会怎么办呢?一来就上真的图谱真的好吗?也许前期就三两个关系链,也许只是业务试水,你就去搞个真的图数据库过来?是不是太浪费了。

是的,实际上前期我们最好自己实现一些简单的关系链维护即可。

那么,为了能够适应稍微的关系变化,也许我们还是需要效仿下图数据库的概念。那么,现在的第一个问题就是:如何使用文字表述一个图关系链?

1. 如何定义规范?

图数据库三大要素: 实体, 关系, 客体 。

实际上要解决这个问题倒也不难,只要自己定一种表示方法,自己能看懂就行,不去管其他人。比如用 '1,2,3' 代表先1后2再3... 但实际上,想要表示稍微复杂点的结构,也许并不是特别容易呢。而且,如果想要考虑后续可能的切真正的图数据库,为何不参考下别人的标准呢?

比如现在通用些的,cypher, gremlin... 大家可以网上搜索下资料,参考下来,好像cypher更形象化些,尤其是各种箭头的使用比较方便。

比如要表示A与的B的关系可以是: (:A)-[:关系]->(:B)

而对于多个复杂关系,则可以用多个类似的关系关联起来就可以了。

嗯,看起来不错。表示的方式定好了,那么我们如何具体处理关系呢?

2. 如何表示一个现实的图关系?

如下图所示,我们有如下关系,应该如何定义字符表达方法,以达到配置的目的?

84dab3e37d0f1e412a513dcd519dbe6c.png

按照第1节中我们定义的规范,我们可以用如下字符串表示。

    (:PEOPLE)-[:养宠物]->(:CAT)-[:吃]->(:RICE)    ,(:PEOPLE)-[:吃]->(:RICE)    ,(:PEOPLE)-[:养宠物]->(:DOG)    ,(:PEOPLE)-[:拥有]->(:HOUSE)    ,(:PEOPLE)-[:干活]->(:JOB)    ,(:CAT)-[:朋友]->(:DOG)    ,(:DOG)-[:吃]->(:RICE)    ,(:JOB)-[:产出]->(:BRICK)    ,(:HOUSE)

应该说还是比较直观的,基本上我们只要按照图所示的关系,描述出出入边和关系就可以了。而且还有相应的cypher官方规范支持,也不用写文档,大家就可以很方便的接受了。

3. 如何解析图关系?

如上,我们已经用字符串表示出了关系了。但单是字符串,是并不能被应用理解的。我们需要解析为具体的数据结构,然后才可以根据关系推导出具体的血缘依赖。这是本文的重点。

实际也不复杂,我们仅仅使用到了cypher中非常少的几个元素表示法,所以也仅需解析出该几个字符,然后在内存中构建出相应的关系即可。

具体代码实现如下:

3.1. 解析框架

所谓框架就是整体流程管控代码,它会让你明白整个系统是如何work的。

import com.my.mvc.app.common.helper.graph.GraphNodeEntityTree;import com.my.mvc.app.common.helper.graph.NodeDiscoveryDirection;import com.my.mvc.app.common.helper.graph.VertexEdgeSchemaDescriptor;import com.my.mvc.app.common.helper.graph.VertexOrEdgeType;import com.my.mvc.app.common.util.CommonUtil;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 功能描述: 简单图语法解析器(类 cypher 语法) * *      请参考网上 cypher 资料 * */public class SimpleGraphSchemaSyntaxParser {    /**     * 解析配置图谱关系配置为树结构     *     * @param cypherGraphSchema 类cypher语法的 关系表示语句     * @return 解析好的树结构     */    public static GraphNodeEntityTree parseGraphSchemaAsTree(String cypherGraphSchema) {        List flatNodeList = tokenize(cypherGraphSchema);        return buildGraphAstTree(flatNodeList);    }    /**     * 构建图关系抽象语法树     *     * @param flatNodeList 平展的图节点列表     * @return 构建好的实例     */    private static GraphNodeEntityTree buildGraphAstTree(                        List flatNodeList) {        Map                uniqVertexContainer = new HashMap<>();        GraphNodeEntityTree root = new GraphNodeEntityTree(flatNodeList.get(0));        uniqVertexContainer.put(flatNodeList.get(0).getVertexLabelType(), root);        GraphNodeEntityTree parent;        GraphNodeEntityTree afterNode;        for ( int i = 1; i < flatNodeList.size(); i++ ) {            VertexEdgeSchemaDescriptor vertexOrEdge1 = flatNodeList.get(i);            if(vertexOrEdge1.getNodeType() == VertexOrEdgeType.EDGE) {                // 存在重复节点,需重建关系                VertexEdgeSchemaDescriptor vertexPrev = flatNodeList.get(i - 1);                if(vertexPrev.getNodeType() != VertexOrEdgeType.VERTEX) {                    continue;                }                if(++i >= flatNodeList.size()) {                    throw new RuntimeException("缺少客体关系配置, near 边["                            + vertexOrEdge1.getRawWord() + "]");                }                VertexEdgeSchemaDescriptor relation = vertexOrEdge1;                VertexEdgeSchemaDescriptor vertexAfter = flatNodeList.get(i);                parent = uniqVertexContainer.get(vertexPrev.getVertexLa
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Base64编码是一种将二进制数据转换为ASCII字符的编码方式,它将原始数据按照固定的规则转换成一串字符。由于Base64编码使用了64个字符表示64个不同的值,因此编码后的数据大小会比原始数据稍微大一些。 具体到片的情况,使用Base64编码将片转换成字符串后,其大小会比原始片的大小大约增加1/3左右。这是因为Base64编码后的字符串中会包含一些额外的字符,用来表示原始数据的编码格式。 需要注意的是,大片转换成Base64编码后的字符串会非常长,可能会导致数据传输的效率降低。因此,在实际应用中,如果需要传输大片,建议直接传输片的URL或者使用其他方式进行传输,而不是将片转换成Base64编码字符串传输。 参考资料: 之前一直有用过对片进行base64编码,然后将base64编码后的串放在请求体中传输,由于http本身并没有对请求体的大小进行限制,因此也并未对片的大小以及编码后的base64串大小进行过研究。因为目前我们的技术架构方面,前端直接访问网关层,由于网关层对body体进行了大小限制,因此我需要了解片和base64编码之间的大小关系。 :https://c.runoob.com/front-end/59这个工具蛮好用的,大片就用它转base64。 :主要介绍了基于JavaScript获取base64片大小,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下。 :当把byte[]通过Convert.ToBase64String转换成Base64编码字符串时数据会明显变大,是为什么呢?我们就先探究一下什么是Base64编码?<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值