Cypher查询帮助:按属性数组内容排序查询结果

问题描述:

我的Neo4J数据库中有一堆场地。每个场地对象都有属性'catIds',它是一个数组,并且包含它的场地类型的Ids。我想查询数据库,以便获取所有Venues,但是它们的排列顺序是它们的catIds匹配或包含一些我查询的Ids列表。我希望这是有道理:)Cypher查询帮助:按属性数组内容排序查询结果

请问,有人可以指示我如何写这个查询的方向?

+1

您好!你到目前为止尝试过什么?你可以请你发布你的数据集样本吗? –

+0

Im新到Neo4J/Cypher,我不知道从哪里开始查询哈哈。通过数据集,你是指创建Venue节点的Cypher Statement/JS代码? –

+1

_“通过数据集,您是指创建Venue节点的Cypher Statement/JS代码吗?”_是的。 _'我不知道从哪里开始查询“_您可能会被低估,希望得到您尚未尝试解决的问题的帮助。请查看[Cypher文档](https:// neo4j。 com/docs/developer-manual/current/cypher /)以及帮助中心部分[我如何提出一个好问题?](https://*.com/help/how-to-ask)来提高您的机会 –

由于您正在图形数据库中工作,因此您可以考虑在图形中对数据进行建模,而不是在难以实现的属性中进行建模。例如,在这种情况下,您可能会创建一堆(v:场所)节点和一堆(t:type)节点,然后通过[:is]关系链接它们。每个场地都链接到一个或多个类型节点。每种类型的节点都有一个 '身份证' 属性:{ID: 'T1'},{ID: 'T2'}等

那么你可以做一个这样的查询:

match (v:venue)-[r:is]->(:type) return v, count(r) as n order by n desc; 

此发现所有的场地,以及所有的类型关系,并返回他们有多少种类型关系。

如果你只想让你列表上的特定场所类型的节点:

match (v:venue)-[r:is]-(t:type) where t.id in ['t1','t2'] return v, count(r) as n order by n desc; 

如果你想所有场馆,但排名根据排序以及他们如何适合你的名单,因为我认为你正在寻找为:

match (v:venue) optional match (v)-[r:is]->(t:type) where t.id in ['t1','t2'] return v, count(r) as n order by n desc; 

这场比赛将得到你所有的场地;如果节点有任何匹配,可选匹配将在您的列表中找到关系。如果一个节点在您的列表中没有链接,则可选匹配将失败并返回null(count)(r),并应排序到最低。

+0

令人惊叹的答案,谢谢你! –