Gremlin / Bulbflow:如何根据边缘和相关顶点的属性选择节点

时间:2013-07-29 16:09:36

标签: graph-databases gremlin bulbs

对于长篇文章感到抱歉,但我想避免对我正在寻找的内容产生任何误解:)

我目前正在发现图形数据库,并尝试使用bulbflow / neo4j。 因此,我试图在我的大多数请求中使用gremlin,但我不知道我想要的请求是否可行。我甚至可能错误地尝试使用图形数据库来处理这种用例,所以不要介意告诉我你是否认为我是在正确的道路上。

首先,让我提供一些背景信息:

我从事早期开源项目,该项目是生成C代码的DSL语言的编译器。我们目前正计划在python中重写整个内容有很多原因(语言,重新设计,开放社区等等)。编译器包括我称之为编译接口和模板的缓存。接口描述模板,每个模板与配置相关联(与接口描述的变量关联的类型化值列表)。

我希望构建的请求的目的是根据输入配置选择单个模板实现(实际上在编译器的生成机制中使用)。最后,我希望能够直接通过gremlin(如果可能的话)请求我正在寻找的单个元素,以便为在这个“缓存”中找到的元素提供单一性。目前,我在python代码中手动匹配此配置,但我想知道在gremlin中直接执行它是否可行。

-

因此,让我们为我的用例定义一个示例图: 我们有三种类型的顶点:

  1. Def(定义),包含一个名为“signature”的String属性,它实际上是此节点定义的模板的签名。
  2. Impl(Implementation),包含两个属性,这些属性是对原始源和预编译文件的修补。
  3. Var(变量),包含一个String属性,它是变量的签名。
  4. 然后,有几种边缘:

    • Def - > impl_by - > Impl(定义可以存在多个实现,不包含任何属性)
    • Impl - > select_by - > Var(可以通过对配置变量值的约束来选择实现,此类型的每个边实际上包含三个属性:类型,值和约束 - 比较运算符 - )

    selected_by边缘(或关系,遵循bulflow的词汇表)描述了一个选择约束,因此具有以下属性:

    • val(与原始实现的变量关联的值)
    • op(比较运算符告诉哪种比较使约束有效)

    这会转换为图形(例如,我将省略此图中selected_by边缘的类型):

                  -- select_by { value="John", op="="}  ---------
                  |                                              \
        (1)--Impl--- select_by { value=12, op=">"}      ------    \
        |                                                     \    \
        |                                                      \    |- Var("name")
        |         |- select_by { value="Peter", op="="} -----------/
    Def (2)--Impl--                                              \/
        |         |- select_by { value=15, op="<"}      ----     /\
        |                                                   \   /  \
        |                                                    |-/----|--- Var("ver")
        (3)--Impl--- select_by { value="Kat", op="!="}  ------/    /
                |                                                 /
                |--- select_by { value=9, op=">"}       ---------/
    

    我想要做的是根据他们与Vars的关系选择一个(或更多)Impl。假设我的配置如下:

    配置1:

    variable="name", value="Peter"
    variable="ver", value=16
    

    这将选择Impl(3),因为Peter!= Kat AND 16&gt; 9,但不是Impl(1),因为Peter!= John和Impl(2),因为16!&lt; 15。

    我被阻止在多个级别上,所以我开始怀疑这是否可行:

    • 我找不到如何将这些参数(配置)提供给gremlin脚本
    • 我找不到如何根据传出边缘的条件选择Impl。

    我希望这不会太混乱。

    干杯,谢谢!

    编辑:

    我设法通过反复回溯和过滤使我的请求的一部分工作。请求(X是起始顶点,VALUE是我想要匹配的值,NAME是要匹配的变量的名称)如下所示:

    请求的基础:

    g.v(X).out('impl').as('implem')
    

    为每对情侣VALUE / NAME重复此部分:

    .out('select_by').filter{it.value=='VAL‌​UE'}
    .inV('select_by').filter{it.name=='NAME'}
    .back('implem')
    

    目前唯一缺少的是我不知道如何使用select_by edge的'op'属性来确定如何构建要使用的过滤器。例如,thre是我想要完全匹配配置的情况(因此,在此请求中,我忽略'op'属性),但是在某些情况下我想要考虑'op'属性,并且在过滤器中使用相关的比较器。

    有没有办法做到这一点? (或者我应该发布另一个问题吗?)

0 个答案:

没有答案