【问题标题】:Neo4j cypher query with variable relationship path length具有可变关系路径长度的 Neo4j 密码查询
【发布时间】:2013-01-02 04:04:37
【问题描述】:

我正在将我的复杂用户数据库迁移到 Neo4j,在该数据库中,用户可以加入多个团队之一,彼此成为朋友等等。在 RDBMS 中执行此操作既痛苦又缓慢,但使用 Neo4j 非常简单且令人兴奋。 :)

我希望有办法查询

  • 一跳的关系和
  • 另一种关系是 2 跳远

来自同一个查询。

START n=node:myIndex(user='345')
MATCH n-[:IS_FRIEND|ON_TEAM*2]-m
RETURN DISTINCT m;

原因是,作为朋友的用户彼此相距一条边,但由团队链接的用户是通过该团队节点链接的,因此他们相距两条边。此查询执行 IS_FRIEND*2 和 ON_TEAM*2,得到队友(是的)和朋友的朋友(嘘)。

Cypher 中是否有一种简洁的方法可以在单个查询中获取不同长度的关系?

【问题讨论】:

  • Joseph,你有没有机会在 console.neo4j.org 上做一个小例子?

标签: neo4j cypher


【解决方案1】:

我重写它以返回一个集合:

start person=node(1) 
match person-[:IS_FRIEND]-friend 
with person, collect(distinct friend) as friends 
match person-[:ON_TEAM*2]-teammate 
with person, friends, collect(distinct teammate) as teammates 
return person, friends + filter(dupcheck in teammates: not(dupcheck in friends)) as teammates_and_friends

http://console.neo4j.org/r/oo4dvx

感谢 Werner 将示例数据库放在一起。

【讨论】:

  • 这就是票。与使用 node(*) 选择器的其他 sol'n 相比,我的运行时间为 3ms。谢谢您的帮助。 :)
【解决方案2】:

我在http://console.neo4j.org/?id=sqyz7i创建了一个小型测试数据库

我还创建了一个查询,将按照您的描述工作:

START n=node(1) 
MATCH n-[:IS_FRIEND]-m 
WITH collect(distinct id(m)) as a, n 
MATCH n-[:ON_TEAM*2]-m 
WITH collect(distinct id(m)) as b, a
START n=node(*) 
WHERE id(n) in a + b
RETURN n

【讨论】:

  • 好电话@werner-vesteras!
  • @werner-verteras 'node(*)' 是否只绑定到集合 a 和 b?分别为 IS_FRIEND 部分和 ON_TEAM*2 部分运行查询始终比组合查询快 20 倍。只运行两个查询并在 Java 中组合它们似乎更快。谢谢。
  • @JosephLust 我不确定,但我猜node(*) 表示整个图表。但这是我能做的最好的事情,只需一个查询。我相信这可以做得更聪明,但 cypher 对我来说仍然很新。
  • 我实际上有一个“展开”功能的功能请求,可以将集合恢复为单个结果。是这个意思吗?
  • github.com/neo4j/neo4j/issues/30 以防您想对其发表评论或投票。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多