我有如下图表(为简单起见,删除了任何标签或链接指示)
我想从节点(c)开始,只查找那些具有2个以上相邻边的节点,以及从(c)到它们的路径。
在上面的例子中,节点(b)有3个相邻边(ba,bc,bg),节点(e)有4个相邻边(ed,ef,eh,eh),所以我想返回路径只是(b)和(e)。
我也不想要返回路径(a),(f),(h),(g)或(j) - 我想在计数时停止遍历满意。
我尝试了以下内容:
START n=node(c)
MATCH (n)-[r*]-(m)-[rx]-(o)
WITH m AS m, n AS n, r AS r, count(rx) as cnt
WHERE cnt > 2
RETURN n, r, m, cnt;
...但除了b和e之外,它还返回a,g,h,f和j的路径。对于大图来说,这也是非常昂贵的。
非常感谢任何帮助。
修改
我提供的示例图片过度简化了我的数据,因此初始建议不起作用(请参阅http://console.neo4j.org/?id=d6feml),因此下面提供了一个新的图片示例。
我想要:只有e和b的路径 - 和以前一样。
我不希望:将路径返回到h。
再次感谢neo4jers ......
答案 0 :(得分:4)
有趣的是,我使用http://console.neo4j.org/r/qc7log将它放入Neo4j控制台。
您正在寻找的Cypher声明是:
START n=node(2) // node c has node id = 2
MATCH p=(n)-[KNOWS*]-(m),(m)-[:KNOWS]-(x)
WITH p, count(x) AS count
WHERE count>2
RETURN p
这里的技巧是在MATCH
中分两部分指定路径。然后,第一部分用于使用WITH
和RETURN
进行聚合。
答案 1 :(得分:0)
基于Stefans关于遍历遍历框架的建议,我花了一些时间试图在python中找到它(neo4j-rest-client)。以下代码段现在有效:
# Retrieve the node at the start of the traveral
seed_node = gdb.nodes(node_id)
# Establish what the traversal should look like
simpleTraversalTemplate = traversals.TraversalDescription().relationships('adjacent')
# Set some un-chainable attributes - work breadth first and set max depth of traversal
simpleTraversalTemplate.breadthFirst()
# This is how far you think it will go before meeting a junction. 100 is high.
simpleTraversalTemplate.max_depth(100)
# Set up a prune evaluator. This by itself (without the filter evaluator)
# returns all traversals up to the point where the link count is > 2. This includes
# the traversals to the nodes before the >2 link_count node.
simpleTraversalTemplate.prune(value={'body':"parseInt(position.endNode().getProperty('link_count')) > 2;",
'language':'javascript'})
# So, a filter is used with the prune to only return those traversals where the end node link_count
# is >2. With only this (ie without prune), the traversal would continue and just keep returning
# those nodes with link_count > 2.
simpleTraversalTemplate.filter(value={'body':"parseInt(position.endNode().getProperty('link_count')) > 2;",
'language':'javascript'})
# Now run the traverser based on the seed node
trav = simpleTraversalTemplate.traverse(seed_node)