当前位置: 首页 > 知识库问答 >
问题:

Gremlin/Janusgraph中的多个顶点标签是否可能,或者替代解决方案是否更好?

金谭三
2023-03-14

我正在为新的图形数据库开发导入运行器。

它需要与:

>

  • Amazon Neptune-Gremlin实现,在生产中具有很好的基础设施支持,但在本地使用很痛苦,并且不支持Cypher。没有提供可视化工具。

    Janusgraph-作为Gremlin实现,很容易在本地使用,但需要大量投资来支持生产,因此使用Amazon Neptune。未提供可视化工具。

    Neo4j-优秀的可视化工具,Cypher语言感觉非常熟悉,甚至可以与Gremlin客户端一起使用,但需要大量投资来支持生产,而且似乎没有任何可视化工具能与Neo4j中的Gremlin实现一样好。

    所以我创建了一个图,其中的实体(节点/垂直)有多种类型(标签),有些是相互正交的,也是多维的。

    例如,表示在线下订单的实体将被标记为OrderOnlineSpendTransaction

                 | Spend       Chargeback
    ----------------------------------------
     Transaction | Purchase    Refund
     Line        | Sale        Return
    

    放大“支出”列。

              | Online      Instore
    ----------------------------------------
     Purchase | Order       InstorePurchase
     Sale     | OnlineSale  InstoreSale 
    

    在Neo4j及其Cypher查询语言中,这被证明非常强大,可以跨多个类型创建关系/边,而无需明确知道图表中的transaction_id值:

    MATCH (a:Transaction), (b:Line)
    WHERE a.transaction_id = b.transaction_id
    MERGE (a)<-[edge:TRANSACTED_IN]-(b)
    RETURN count(edge);
    

    问题是,Gremlin/Tinkerpop不支持其顶点的多个标签。

    像AWS Neptune这样的服务器实现将使用一个分隔符来支持这一点,例如< code > Order::Online::Spend::Transaction ,Gremlin客户端确实支持Neo4j服务器,但是我还没有找到一个这样的例子。

    最终,我需要能够运行一个等效于上面的 Cypher 的 Gremlin 查询:

    g
      .V().hasLabel("Line").as("b")
      .V().hasLabel("Transaction").as("a")
      .where("b", eq("a")).by("transaction_id")
      .addE("TRANSACTED_IN").from("b").to("a")';
    
    

    所以这里有多个问题:

    1. 有没有办法让JanusGraph接受多个顶点标签?
    2. 如果不可能,或者这不是最好的方法,是否应该有一个包含标签列表的附加顶点属性?
    3. 在选项2的情况下,标签名称应该是高级标签(Transaction)还是低级标签(Order)?
  • 共有1个答案

    林英朗
    2023-03-14

    有没有办法让JanusGraph接受多个顶点标签?

    不,在JanusGraph中不能有多个顶点标签。

    如果不可能,或者这不是最好的方法,是否应该有一个包含标签列表的附加顶点属性?

    在选项2的情况下,标签名称应该是高级标签(Transaction)还是低级标签(Order)?

    我将一起回答这两个问题。基于你上面描述的内容,我将创建一个标签,可能名为Transaction,并使用与它们相关的不同属性,例如位置(在线或InStore)和类型(购买、退款、退货、退款等)。看看你如何描述上面的问题,你实际上只是在谈论一个实体,一个交易,其中你用作标签的所有其他项目(在线/InStore、支出/退款)实际上只是关于交易如何发生的额外元数据。因此,上述方法将允许对这些属性中的一个或多个进行简单过滤,以实现您在Neo4j中使用的多个标签可以完成的任何事情。

     类似资料:
    • 我知道苹果发布了基于蓝牙4.0协议的iBeacon。 在任何蓝牙设备中,如果我们使用以下代码对设备进行编码: 表示呈现此蓝牙设备是iBeacon蓝牙设备。 我的问题是,如果我定义了自己的协议,这意味着我会改变它 是否有一种可能性,我可以通过iphone识别我自己定义的蓝牙设备,而无需在iphone上添加识别设备。 苹果是否支持定制ibeacon? 编辑根据davidgyoung所说,我对stack

    • 问题内容: 如果我使用Oracle,则有一个可用于创建层次查询的关键字。当前,我在一个项目上使用MySQL,我想知道MySQL中是否有替代方法? 我尝试谷歌,但无济于事。我想要实现的是通过一个查询从数据库中获取一棵树。涉及两个表: 和。后者包含两个ID,一个是,另一个是。因此,它基本上是一个自联接,我可以使用该模型创建图。实际上,它目前仅用于创建树,但是将来可能会改变。但无论哪种情况,我都想拥有的

    • vue-draggable-plus 有没有拖拽替换的功能 举例: 我有一个初始化长度为10的数组 const arr1 = new Array(10).fill({}) 然后有一个长度不限的数组可以用于拖拽至数组arr1中 const arr2 = [{x: 1}, {x: 2}, {x: 3}, {x: 4}, {x: 5}, {x: 6}, {x: 7}, {x: 8}, {x: 9}, {

    • 根据文件中的说明: setState()不会立即改变this.state,但会创建挂起的状态转换。调用此方法后访问this.state可能会返回现有值。 对setState的调用不能保证同步操作,可能会为了提高性能而对调用进行批处理。 因此,由于是异步的,因此无法保证其同步性能。是否有同步的替代方法。 例如 因为值是以前的值,所以什么是替代方案,将给予使用。 Stackoverflow上有几个问题

    • 问题内容: 因此,我在大学期间正在学习有关HTML列表的知识,这位教授说与其他标记(如和)一起没有结尾标记。那是正确的吗?因为最后我看到了很多使用tag的模板/主题,还有许多网站也教您存在,所以我不确定该相信谁以及正确的使用方式是什么? 我问这个问题的原因是因为上次我们了解了标记,他说,当您将鼠标悬停在该属性上时,该属性会为您提供一个显示在图像上方的文本,当我在此处询问该属性时,它仅是替换图像的替

    • 问题内容: 我正在制作一个程序,要求至少每秒捕获24个屏幕截图。目前,使用下面的代码,我每94毫秒仅获得1个,因此大约为10毫秒。 我不想使用任何第三方库,因为我试图将其保持尽可能小,但是如果我希望获得显着的性能提升,我会愿意的。我也试图保持该平台独立,但是,如果确实能够显着提高性能,我愿意将其限于Windows。 编辑:我现在也尝试了两种不同的方法;使用在oracles网站上找到的代码段,并在下

    • 问题内容: 在高斯消除矩阵的标准方法的宇宙中是否有某处? 人们通过谷歌找到了很多片段,但我更愿意使用“可信任”模块。 问题答案: 我终于发现,可以使用 LU分解 完成此操作。在此, U 矩阵表示线性系统的简化形式。 然后读 取决于系统的可溶解性,该基质具有上部三角形或梯形结构。在上述情况下,由于矩阵只有rank,所以会出现零线。

    • 我在一本书中发现了一个“用餐哲学家问题”的替代解决方案,用Java编写: 解决方案的文本是: 或者,我们可以给筷子贴上从e到N-1的标签。每个哲学家都试图先拿起编号较低的筷子。这基本上意味着每个哲学家都会先选择左边的筷子,再选择右边的筷子(假设你是这样给它贴标签的),除了最后一位哲学家会选择相反的方式。有了这个解决方案,哲学家不可能拿着大筷子而不拿着小筷子。这就阻止了循环的能力,因为循环意味着较高