有没有办法使用数字比较运算符(> =,< =,<,>,...)在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]
相反,我想对'属性'进行范围搜索,例如找到'property'> = 0&&的所有边。 'property'< = 1.6。这可以用Gremlin完成吗?查看Gremlin users discussion group告诉我,即使是全文Lucene索引中的通配符搜索也有点破解,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()
这在语法上是正确的,但即使边缘的属性在该范围内,count也会得到0结果。
答案 0 :(得分:2)
您可以在所有边上使用Gremlin过滤器步骤,但这会进行表扫描:
g.E.filter{it.property >= 0 && it.property <= 1.6}
请参阅https://github.com/tinkerpop/gremlin/wiki/Gremlin-Steps
如果index 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}
答案 1 :(得分:0)
或许你最好的选择是通过groovy使用Neo4j API,就像http://docs.neo4j.org/chunked/snapshot/gremlin-plugin.html#rest-api-send-an-arbitrary-groovy-script---lucene-sorting一样?