对于长篇文章感到抱歉,但我想避免对我正在寻找的内容产生任何误解:)
我目前正在发现图形数据库,并尝试使用bulbflow / neo4j。 因此,我试图在我的大多数请求中使用gremlin,但我不知道我想要的请求是否可行。我甚至可能错误地尝试使用图形数据库来处理这种用例,所以不要介意告诉我你是否认为我是在正确的道路上。
首先,让我提供一些背景信息:
我从事早期开源项目,该项目是生成C代码的DSL语言的编译器。我们目前正计划在python中重写整个内容有很多原因(语言,重新设计,开放社区等等)。编译器包括我称之为编译接口和模板的缓存。接口描述模板,每个模板与配置相关联(与接口描述的变量关联的类型化值列表)。
我希望构建的请求的目的是根据输入配置选择单个模板实现(实际上在编译器的生成机制中使用)。最后,我希望能够直接通过gremlin(如果可能的话)请求我正在寻找的单个元素,以便为在这个“缓存”中找到的元素提供单一性。目前,我在python代码中手动匹配此配置,但我想知道在gremlin中直接执行它是否可行。
-
因此,让我们为我的用例定义一个示例图: 我们有三种类型的顶点:
然后,有几种边缘:
selected_by边缘(或关系,遵循bulflow的词汇表)描述了一个选择约束,因此具有以下属性:
这会转换为图形(例如,我将省略此图中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。
我被阻止在多个级别上,所以我开始怀疑这是否可行:
我希望这不会太混乱。
干杯,谢谢!
编辑:
我设法通过反复回溯和过滤使我的请求的一部分工作。请求(X是起始顶点,VALUE是我想要匹配的值,NAME是要匹配的变量的名称)如下所示:
请求的基础:
g.v(X).out('impl').as('implem')
为每对情侣VALUE / NAME重复此部分:
.out('select_by').filter{it.value=='VALUE'}
.inV('select_by').filter{it.name=='NAME'}
.back('implem')
目前唯一缺少的是我不知道如何使用select_by edge的'op'属性来确定如何构建要使用的过滤器。例如,thre是我想要完全匹配配置的情况(因此,在此请求中,我忽略'op'属性),但是在某些情况下我想要考虑'op'属性,并且在过滤器中使用相关的比较器。
有没有办法做到这一点? (或者我应该发布另一个问题吗?)