2

我是 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 定义它?还是我需要另一种方式?

预先感谢。

4

2 回答 2

1

我有一种感觉,这可以被破解reduce并计算每一个偶数(每秒)的关系:

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

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

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

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

于 2013-02-26T09:15:35.423 回答
0

我玩过这个并创建了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 访问。

于 2013-03-06T11:52:36.817 回答