lucene - Gremlin 中的数字比较运算符和通配符

标签 lucene range wildcard neo4j gremlin

有没有办法使用数字比较运算符(>=、<=、<、>、...)在 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 &&“属性”<= 1.6 的所有边。 Gremlin 可以做到这一点吗?正在查看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 个结果。

最佳答案

您可以在所有边缘上使用 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}

关于lucene - Gremlin 中的数字比较运算符和通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11351844/

相关文章:

sql - PostgreSQL 时间戳 - 索引

java - 为什么我不能在接收参数化参数的方法中使用通配符?

java - 看似等效的 Solr 查询之间的评分差异

lucene - org.apache.lucene.queryParser.ParseException

vba - 如何使用间接引用在vba中选择单个单元格或范围

java - 如何向 Java 通用通配符列表添加元素

python - 使用通配符键元素访问 Python 字典

Solr - 仅匹配精确的短语

java - 搜索时匹配索引字段之间的前缀

javascript contentEditable - 包装交叉标签选择