neo4j复杂模式搜索

时间:2013-02-25 16:25:25

标签: neo4j

我是NEO4J的新手,我需要有关特定问题的帮助。或者如果可能的话,给出答案。

SETUP: 我们有2种不同类型的节点:用户(A,B,C,D)和产品(1,2,3,4,5,6,7,8) 接下来,我们在用户和产品之间存在两种不同类型的关系,其中用户对产品进行了广告以及产品由用户拥有。

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

    现在

    1. B想要1
    2. C想要3
    3. D想要5
    4. 所以现在,我没有任何问题,我毫无困难地创建了图表数据。我的问题从这里开始。当A想要产品8时,我们有一个圆圈。

      A - [:WANTS] - GT; 8 - [:OWNEDBY] - GT; d - [:WANTS] - 5 - [:OWNEDBY] - 以及c - [:WANTS] - 将3- [:OWNEDBY] - GT;乙 - [:WANTS] - →1 - [:OWNEDBY] - >一种

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

      现在我想要做的是找到遵循该模式的起始节点(启动想要产品的用户)的路径。 如何使用Cypher定义?或者我需要另一种方式吗?

      先谢谢。

2 个答案:

答案 0 :(得分: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次,直到结束节点。

答案 1 :(得分:0)

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

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代码应用图算法。您可以使用unmangaged扩展来提供对此的REST访问。