0

我有一个名为“flavors”的属性的节点,其中包括这样的数据元组:

node1.flavors = {"cherry":174,"vanilla":105,"chocolate":60}
node2.flavors = {"cherry":17,"vanilla":10,"chocolate":300}

我想找到与巧克力相关的最大整数的节点,即 node2。我怎样才能做到这一点?

我想出了如何使用正则表达式来获取巧克力在风味属性中的那些:

start n=node(*)
WHERE has(n.flavors) AND n.flavors =~ '.*chocolate.*'
RETURN count(n);

现在我只需要得到 "chocolate": _之后的数字。

更多信息:这是一个 JSON 字符串。如果我不能在 cypher 中处理它,我将不得不在 Ruby 中处理它并在 neo4j 中重新构建数据模型。我相信我不能使用子字符串,因为我们在属性上没有 indexOf 函数,对吧?

2.0.0p247 :002 > r = JSON.parse('{"vanilla":161,"chocolate":21,"cherry":18}')
 => {"vanilla"=>161, "chocolate"=>21, "cherry"=>18} 
2.0.0p247 :004 > r.class
 => Hash 
2.0.0p247 :005 > r.keys
 => ["vanilla", "chocolate", "cherry"] 
2.0.0p247 :006 > r.values
 => [161, 21, 18] 
2.0.0p247 :007 > r["vanilla"]
 => 161
4

1 回答 1

3

您提供的查询将检查图表中的每个节点,随着图表大小的增加,这些节点会变慢。您正在尝试使用 Cypher 进行字符串操作,而 Cypher 首先是一种查询图形的语言。在我看来,您要么使用了错误的数据存储,要么没有为图形有用地建模。为什么不制作节点(recipies?)和风味实体并将它们与具有关于它们具有多少风味的属性的关系连接起来?然后,您可以轻松高效地查询它们。我在这里快速建模:http: //console.neo4j.org/r/tp355x(使用 Cypher/Neo4j 2.0)。

所以,这个问题的答案是不要尝试将 Cyhper 用于它不是真正为它设计的东西,而是像上面演示的那样在你的 Ruby 代码中重做模型。

如果您需要有关如何在图表中表示数据的灵感,也许有Graph Gists可以为您提供一些想法。

于 2013-11-08T17:05:32.247 回答