spark connector run ngql 如何传多个label

提问参考模版:

  • nebula 版本:3.4.1
  • 部署方式:分布式
  • 安装方式:RPM
  • 是否上生产环境:Y
  • 硬件信息
    • 磁盘( 推荐使用 SSD)
    • CPU、内存信息
  • 问题的具体描述
  • 相关的 meta / storage / graph info 日志信息(尽量使用文本形式方便检索)

hi @wey 看到你的项目可以跑ngql nebula-up/spark/pagerank_example.ipynb at main · wey-gu/nebula-up (github.com)

想问个问题,如果我想跑subgraph 该如何做?尝试了下

  1. label 不能写多个
  2. 语句为GET SUBGRAPH WITH PROP 2 STEPS FROM ‘f625a5b661058ba5082ca508f99ffe1b’ BOTH HasCompany,Controlled YIELD VERTICES as v, Edges as e
    目前这个有办法解决吗?
# option 1: read graph data with ngql, get data from graphd
df = spark.read.format(
  "com.vesoft.nebula.connector.NebulaDataSource").option(
    "type", "edge").option(
    "spaceName", "basketballplayer").option(
    "label", "follow").option(
    "returnCols", "degree").option(
    "metaAddress", "metad0:9559").option(
    "graphAddress", "graphd:9669").option(
    "ngql", "MATCH ()-[e:follow]->() return e LIMIT 1000").option(
    "partitionNumber", 1).load()

我的

    df = (
        spark.read.format("com.vesoft.nebula.connector.NebulaDataSource")
        .option("type", "edge")
        .option("spaceName", SPACE)
        .option("label", "HasCompany")
        .option("returnCols", "role")
        .option("metaAddress", metaHost[cluster])
        .option("graphAddress", graphHost[cluster])
        .option("partitionNumber", 1000)
        .option("operateType", "read")
        .option("ngql", "GET SUBGRAPH WITH PROP 2 STEPS FROM 'f625a5b661058ba5082ca508f99ffe1b' BOTH HasCompany,Controlled YIELD VERTICES as v, Edges as e")
        .load()
    )

目前 spark connector 的 ngql reader 实现的很懒,只支持了 match :cry:,对于任意query result 的支持理论上不难,只需要把查询写一下迭代的 cast 逻辑就可以,但是还没人做

看了一下实现,似乎只解析了两种类型的 value, edge 和 list of edge,比我想像的多一种情况,而且会白名单对照 edge 类型,你的 return 如果改成只有 edges AS e 没有 vertex 现成的实现应该是可以解析的,试试?

我不会java scala 这是比较头疼的 :thinking:

嗯嗯,我说你改一下query本身哈,不用动 spark connector,只 return edges 感觉就可以(我也不会 java scala​:cry:)。

我无 scala/java 知识撸了一个 pr ,感觉主要还是那个 raise ,改善一下这个情况,有了 feat: support path in nGQL, not raise exception for other types by wey-gu · Pull Request #133 · vesoft-inc/nebula-spark-connector · GitHub 应该 FIND PATH/GET SUBGRAPH/复杂的大多数 MATCH 也都支持了。

感谢大佬,试了下return edges 是行的,但是有问题,

    df = (
        spark.read.format("com.vesoft.nebula.connector.NebulaDataSource")
        .option("type", "edge")
        .option("spaceName", SPACE)
        .option("label", "HasCompany")
        .option("returnCols", "role")
        .option("metaAddress", metaHost[cluster])
        .option("graphAddress", graphHost[cluster])
        .option("partitionNumber", 1000)
        .option("operateType", "read")
        .option("ngql", "GET SUBGRAPH WITH PROP 2 STEPS FROM 'f625a5b661058ba5082ca508f99ffe1b' BOTH HasCompany,Controlled YIELD VERTICES as v, Edges as e")
        .load()
    )

  1. 在这个里面, label 只能指定一个HasCompany, 导致 语句里面即便写了多个边类型 也是无效得,这个能怎么解决吗?
  2. returnCols 里面 有办法返回edge 的type吗?
    我看正常Console 里面返回的meta 信息里面是有的
    image
  3. 或者说如何返回edge 的所有属性,因为如果两种edge 的schema 不同,不能指定两种edge 对应的returnCols 的话 会有问题,只能分开一种边一个语句?
1 个赞

现有实现不行,你这个是宝贵的真实场景需求,列一下到这个 issue 里?

我就这这个 pr 看看能不能一起撸出来

@nicole 感觉这个 ngql reader 场景支持多类型边比较自然(相比于全图扫的场景),可不可以考虑允许 NebulaOptions.label 如果带逗号,分割成多个边,当它是多个的时候,returnCols 是 jsonString 这样向后兼容的扩充 returnCols可以是二维 list?如果 OK 的话,我试着实现一下

1 个赞

这个要实现吗? 我看pr 里面只加了asPath 的解析。ps: 我理解path 应该是包含了vertex 和 edge 的属性的吧?

path 也是只取 edges

哦哦,那这样还是有挺多局限的

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。