2

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

我目前正在发现图形数据库,并尝试使用bulbflow/neo4j。因此,我正在尝试对我的大多数请求使用 gremlin,但我不知道我想要的请求是否可行。我什至可能在尝试将图形数据库用于此类用例时是错误的,所以请不要介意告诉我您是否认为我走在正确的道路上。

首先,让我提供一些上下文:

我从事一个早期的开源项目,它是一个用于生成 C 代码的 DSL 语言的编译器。由于许多原因(语言、重新设计、向社区开放等等……),我们目前正计划用 python 重写整个东西。编译器包括我称之为已编译接口和模板的缓存。接口描述了模板,每个模板都与一个配置相关联(与接口描述的变量相关联的类型值列表)。

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

-

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

  1. Def(Definition),包含一个名为“signature”的String属性,其实就是这个节点定义的模板的签名。
  2. Impl(实现),包含两个属性,它们是原始源文件和预编译文件的路径。
  3. Var(变量),包含一个字符串属性,它是变量的签名。

然后,几种边缘:

  • 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。假设我有如下配置:

配置一:

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

这将选择 Impl(3) since Peter != Kat AND 16 > 9,但不会选择 Impl(1) since Peter != John 或 Impl(2) since 16 !< 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 边缘的 'op' 属性来确定如何构建要使用的过滤器。例如,在某些情况下,我想完全匹配配置(因此,在此请求中,我忽略了“op”属性),但在某些情况下,我想考虑“op”属性,并且在过滤器中使用相关的比较器。

有什么办法吗?(或者我应该发布另一个问题?)

4

0 回答 0