【问题标题】:neo4j complex pattern searchingneo4j 复杂模式搜索
【发布时间】:2013-02-25 16:25:24
【问题描述】:

我是 NEO4J 的新手,我需要针对特定​​问题的帮助。或者如果可能的话,也可以给出答案。

设置: 我们有 2 种不同类型的节点:用户 (A,B,C,D) 和产品 (1,2,3,4,5,6,7,8) 接下来,我们在用户和产品之间有 2 种不同类型的关系,其中用户想要产品和产品由用户拥有。

  1. 1,2归A所有
  2. 3,4 归 B 所有
  3. 5,6归C所有
  4. 7,8归D所有

现在

  1. B 想要 1 个
  2. C要3个
  3. D要5个

所以现在,我没有任何问题,并且我轻松创建了图形数据。我的问题从这里开始。当 A 想要产品 8 时,我们有一个圆圈。

A-[:WANTS]->8-[:OWNEDBY]->D-[:WANTS]->5-[:OWNEDBY]->C-[:WANTS]->3-[:OWNEDBY]- >B-[:WANTS]->1-[:OWNEDBY]->A

所以我们有一个独特的模式,U-[:WANTS]->P-[:OWNEDBY]->U

现在我要做的是按照该模式找到通往开始节点(启动想要产品的用户)的路径。 如何使用 Cypher 定义它?还是我需要其他方式?

先谢谢了。

【问题讨论】:

  • 您在寻找从 U 到 U 的最短路径吗?如果是这样,这个问题之前已经回答过:stackoverflow.com/questions/14893127/cypher-query-shortest-path
  • 是的,我正在寻找最短路径,但答案只涉及从-[:LINE*]-to。这个答案只有一种关系。我有不同的关系。
  • 您可以匹配多个关系,即from-[:LINE|ARROW*]-to。它在文档中:docs.neo4j.org/chunked/milestone/…
  • 这不是答案。该查询在两个节点之间查找关系 LINE“或”关系 ARROW。我正在寻找关系 USER_A WANTS PRODUCT,然后是 PRODUCT OWNEDBY USER_B,就像我的示例中一样
  • 我自己通过引入一个额外的关系部分解决了这个问题。每次我有这种模式 A-[:WANTS]->P-[:OWNEDBY]->D 我创建一个关系 D-[:CANHAVE]->A 所以我的密码变成 START wanter=node(1) MATCH p= (wanter

标签: neo4j


【解决方案1】:

我觉得这可以用reduce 破解并计算每一个偶数(每秒)的关系:

MATCH p=A-[:OWNEDBY|WANTS*..20]->X
WITH r in relationships(p)
RETURN type(r),count(r) as cnt, 
WHERE cnt=10;

或者可能计算所有rels数量为偶数的路径:

MATCH p=A-[:OWNEDBY|WANTS*..]->X    
RETURN p,reduce(total, r in relationships(p): total + 1)  as tt
WHERE tt%2=0;

但是您的图表必须具有严格的模式,其中来自所有所有者和需求集合的所有传入关系必须不同于来自同一集合的所有传出关系。换句话说,这种模式不可能存在:A-[:WANTS]->B-[:WANTS]->C or A-[:OWNEDBY]->B-[:OWNEDBY]->C

查询可能在语法上是错误的,但是如果您将更多地使用它,则可以在密码中实现该逻辑。 或者使用 gremlin,我想我在某处看到了一个 gremlin 查询,您可以在其中定义一个模式,然后通过该模式循环 n 次直到结束节点。

【讨论】:

  • 谢谢,我会试试这个。我确实有这种严格的模式,所以它应该可以工作。我还没用过gremlin。我现在正在构建一个原型,我只使用带有密码的 REST api。
  • 我找到了这个链接 (markorodriguez.com/2011/06/15/…),看起来很有希望。
  • 黄金法则:如果可以用 cypher 完成,就用 cypher 完成。如果没有,请重建您的数据库设计。之后你就可以玩 gremlin 了:)。我认为未来 neo4j 将只专注于 cypher,gremlin 部分可能会过时。
【解决方案2】:

我玩过这个并创建了http://console.neo4j.org/?id=qq9v1 显示示例图。我发现以下密码语句解决了这个问题:

start a=node(1) 
match p=( a-[:WANTS]->()-[:WANTS|OWNEDBY*]-()-[:OWNEDBY]->a ) 
return p 
order by length(p) desc 
limit 1

只有一个小故障:中间部分 [:WANTS|OWNEDBY*] 不要求交替 WANT 和 OWNEDBY 链。正如@ulkas 所说,如果您在数据建模期间小心,这应该不是问题。 您还可以查看 http://api.neo4j.org/current/org/neo4j/graphalgo/GraphAlgoFactory.html 以从 Java 代码应用图形算法。您可以使用非托管扩展来提供对它的 REST 访问。

【讨论】:

  • 感谢 ulkas,stefan,它有效。我现在可以继续前进了。我会带着更有趣的“挑战”回来。
猜你喜欢
  • 2017-06-09
  • 2015-08-20
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2012-08-19
  • 1970-01-01
相关资源
最近更新 更多