修改密码

请输入密码
请输入密码 请输入8-64长度密码 和 email 地址不相同 至少包括数字、大写字母、小写字母、半角符号中的 3 个
请输入密码
提交

修改昵称

当前昵称:
提交

申请证书

证书详情

Please complete this required field.

  • Ultipa Graph V4

Standalone

Please complete this required field.

Please complete this required field.

服务器的MAC地址

Please complete this required field.

Please complete this required field.

取消
申请
ID
产品
状态
核数
申请天数
审批时间
过期时间
MAC地址
申请理由
审核信息
关闭
基础信息
  • 用户昵称:
  • 手机号:
  • 公司名称:
  • 公司邮箱:
  • 地区:
  • 语言:
修改密码
申请证书

当前未申请证书.

申请证书
Certificate Issued at Valid until Serial No. File
Serial No. Valid until File

Not having one? Apply now! >>>

ProductName CreateTime ID Price File
ProductName CreateTime ID Price File

No Invoice

如何查询图中所有孤点

回答此问题
解决
wanyisun2022-03-30


查询孤点

3 个回答

  • 4 点赞

    可是使用度算法,K邻查询,和路径计算来获取孤点,

    下面举例使用路径计算,来获取孤点:

    在该语法中有几个注意点:

    • 使用了optional来说明 路径是否有有结果,数据流都会继续下去
    • 模板计算使用了limit 来控制最小计算量,注意:这里面的limit当做模板参数进行的,也就是意味着,每个start点来临的时候,模板最多只计算一条路径返回
    • 使用_uuid == 0来进行判断 optional 的路径计算结果中,邻居是否有值这一点未来也可以使用null类型来判断


    apitlu 2022-04-01
    • 这样等于是计算出了所有点的度。大神再帮我看看,现在想找孤点,能不能只返回其中度为零的点的id呢?

      wanyisun2022-03-31

    • 已经修改答案,看是否可以满足需求

      apitlu2022-04-01

    添加评论...

    取消
    提交
  • 2 点赞

    用 apitlu 大神给出的方法可以找到没有自环边的孤点

    如果是要找有自环边的孤点,还需要修改下语句。

    其实不管是查找什么样的结构,都先要搞清这些结构的搜索特征。

    1,无自环边的孤点

    无自环边的孤点完全构不成 n().e().n() 形式的路径,也就是说,如果一个无自环边的孤点的 _uuid == 1,那么 optional n(1).e().n() 将返回 0-0-0 的结果。因此,可以依次考查图中各个节点(假设别名为 start)的 optional n(start).e().n() 的结果,凡是返回 0-0-0 的即为无自环边的孤点。这就是之前 apitlu 给出的答案:  

    
    find().nodes() as start with start
    optional n(start as key).e(as edge).n(as dst).limit(1)
    where dst._uuid == 0 // 这里用 key._uuid == 0 或 edge._uuid == 0 来判断也是可以的,但是不能用 start._uuid == 0,因为 start 是点查询的结果,start._uuid 不可能为 0
    return start
     

    2,有自环边的孤点

    有自环边的孤点情况更复杂一些,因为孤点与其自环边可以构成 n().e().n() 形式的路径,仍然假设孤点的 _uuid == 1,则孤点的每一条自环边都能返回一条 n(1).e().n(1) 路径。由于 n(1).e().n(1) 有结果只能说明节点 1 有自环边,我们还必须证明节点 1 不与其他任何节点相连。假设含有自环边的节点别名为 start,那么含有自环边的孤点是能使 optional n(start).e().n({_uuid != start._uuid}) 返回 0-0-0 的那些 start。以下是 uql 语句:

    
    n(as n1).e().n(n1)
    with distinct(n1) as start
    optional n(start as key).e(as edge).n({_uuid != start._uuid} as dst).limit(1)
    where dst._uuid == 0
    return start


    Ultipa Admin 2022-04-20
    • 赞👍

      apitlu2022-04-19

    添加评论...

    取消
    提交
  • 1 点赞

    有两种求数组差集的思路。

    思路 1:先找到所有点,然后找到所有有边(自环边不算)的点,分别收集为数组后,求两个数组的差集,就返回孤点的 UUID

    find().nodes() as a
    n(as b).e().n({_uuid != b._uuid})
    with collect(a) as a1, collect(b) as b1
    return difference(a1,b1)

    上面的解法会遍历所有边,如果要用 limit() 参数控制最小计算量,可修改为:

    find().nodes() as a with a
    n(a as a1).e().n({_uuid != a._uuid}).limit(1) 
    with collect(a1) as a2
    find().nodes() as b
    with collect(b) as b1
    return difference(b1,a2)

    思路 2:先找到所有点,收集为数组;再找到所有边(不包括自环边),将边的起点和终点分别收集为数组;然后求前一个数组与后两个数组的差集

    find().nodes() as n
    with collect(n) as n1
    find().edges({_from_uuid != _to_uuid}) as e
    with collect(e._from_uuid) as n2, collect(e._to_uuid) as n3
    return difference(difference(n1,n2),n3)
    Pearl C 2022-04-27
    • 数组运算也是一个很好的解体思路!

      Ultipa Admin2022-04-27

    添加评论...

    取消
    提交

你的回答:

提交
取消