neo4j:当属性包含数组时,从节点属性中获取数据并对其进行排序

时间:2013-11-07 07:56:53

标签: neo4j cypher

我有一个名为'flavors'的属性的节点,其中包含如下数据元组:

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

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

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

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

现在我只需要在“巧克力”之后得到这个数字: _

更多信息: 这是一个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

1 个答案:

答案 0 :(得分:3)

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

所以,问题的答案不是尝试使用Cyhper来实现它并不是真正做的事情,而是重做Ruby代码中的模型,如上面演示的那样。

如果您需要获得有关如何在图表中表示数据的灵感,可能会Graph Gists给您一些想法。