检查连接到n个属性的节点的最快方法

时间:2015-10-05 18:54:49

标签: neo4j cypher

现在我有一个循环产生我的距离,但看起来他们可能是一种更有效的方式

taglst = ['term1', 'term2', 'term3', 'term4', 'term5']
for i, each in enumerate(taglst):
    word = 'dist'+str(i)
    if i == 0:
        q += "MATCH p-[r]-(g {name:\'%s\'}) WITH p, r.dist as %s " %    (each, word)
    else:
        temp = 'dist'+str(i-1)
        q += "MATCH p-[r]-(g {name:\'%s\'}) WITH p, r.dist + %s as %s " %(each, temp, word)
 q += "RETURN p ORDER by %s ASC" %(word)

任何需要帮助的理论或想法都会很棒,我并不关心python只是想展示cypher查询的工作流程。

1 个答案:

答案 0 :(得分:2)

是的,应该有一种更简单的方法。试试这个:

MATCH (p)-[r]-(g) 
WITH p, r, collect(g) as gNodes
WHERE ALL (gNode in gNodes WHERE gNode.name in ['term1', 'term2', 'term3'])
RETURN p ORDER BY r.something ASC

您需要对此进行定制,但其工作方式是检查所有可能g个节点的名称是否在您的列表中。这样可以节省您重复匹配的方式。

然而 - 您还没有提供足够的信息来使这个查询真的很好。正如我已经制定了这个,它会变得昂贵,因为(p)-[r]-(g)没有限制。模糊的东西是匹配整个图形的公式。如果你在rp上设置一个初始标准来缩小范围,那就更好了。