【问题标题】:Numeric comparison operators and wildcards in GremlinGremlin 中的数值比较运算符和通配符
【发布时间】:2012-07-05 20:09:43
【问题描述】:

有没有办法使用数字比较运算符(>=、、...)在 Neo4j 中搜索手动索引?查看 Gremlin 索引示例,它们都倾向于呈现具有特定属性值的搜索。

假设我有大约 10M 的两种类型的关系,它们在一个名为“property”的属性中都有数值,在第一个 double 中,在第二个 int 中。

gremlin> g.e(123).getProperty('property')
==> 1.57479276459179

现在,如果我知道确切的属性值,即 double 类型的基于对数的 pvalue,我可以很容易地找到节点

gremlin> g.idx('index_e_ASSOC').get('property', 1.57479276459179)
==> e[2421730][31493-ASSOCIATION->53378]
==> e[4885094][53378-ASSOCIATION->31493]
==> e[866409][37891-ASSOCIATION->6292]
==> e[123][6292-ASSOCIATION->37891]

相反,我想对“属性”进行范围搜索,例如查找“属性”> = 0 && '属性' Gremlin users discussion group 告诉我,即使是从全文 Lucene 索引中进行通配符搜索也有点 hack,Neo4j API 也无济于事。

编辑:在 Stackoverflow 中发现了另一个类似的问题(标题为“使用 Lucene 查询语法在 Neo4j 中进行范围查询”;新用户最多只能发布两个超链接)导致 Neo4j 文档。我通过对数值使用 ValueContext 重新创建了索引。通过在 neo4j 讨论组中找到一个示例(标题:将 numericRange 查询与关系查询结合起来),我可以进行类似的查询

start a=node(123)
match a-[rel]-(b)
where type(rel) = "ASSOCIATION" AND rel.`property` > 1.0 AND rel.`property` < 2.0
RETURN b
LIMIT 20;

使用范围搜索。 Gremlin 的语法是什么?应该是这样的

g.idx('index_e_ASSOC')[[property: Neo4jTokens.QUERY_HEADER + "[1.0 TO 2.0]"]].count()

这在语法上是正确的,但即使在该范围内有属性的边,计数也会产生 0 结果。

【问题讨论】:

    标签: lucene range wildcard neo4j gremlin


    【解决方案1】:

    您可以在所有边上使用 Gremlin 过滤器步骤,但这会进行表扫描:

    g.E.filter{it.property >= 0 && it.property <= 1.6}
    

    https://github.com/tinkerpop/gremlin/wiki/Gremlin-Steps

    如果索引index_e_ASSOC 包含所有边的子集,您可以使用通配符查询来缩小范围:

    start = g.idx('index_e_ASSOC')[['property': Neo4jTokens.QUERY_HEADER + "*"]]
    start.filter{it.property >= 0 && it.property <= 1.6}
    

    注意Neo4jTokens.QUERY_HEADER 解析为"%query%",所以你也可以这样写:

    start = g.idx('index_e_ASSOC')[['property': "%query%" + "*"]]
    start.filter{it.property >= 0 && it.property <= 1.6}
    

    【讨论】:

      【解决方案2】:

      您最好的选择可能是通过 groovy 使用 Neo4j API,就像 http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting 一样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-23
        • 2012-10-17
        • 1970-01-01
        • 2021-10-02
        • 2021-11-27
        • 2023-03-26
        • 1970-01-01
        • 2015-01-04
        相关资源
        最近更新 更多