我如何避免在neo4j中多次访问具有相同属性的节点



我的Cypher查询:

MATCH p =(o:Order)-[r:seeks*2..8]->(o:Order)
WHERE o.Name="000093" AND ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN    tail(nodes(p)) WHERE x=y))
RETURN extract(n IN nodes(p)| n.Name) AS OrderID, extract(u IN nodes(p)| u.UserName) AS UserName,length(p), endNode(r[0])
ORDER BY length(p)

我想避免在路径中具有相同属性值的节点,如何避免它们?

["000093","000090","000096","000097","000107","000091","000089","000093"]
["yunis","gio","Anhar","Jhon","**shakilbit**","xalima","**shakilbit**","yunis"]

因此,0000107和000089的订单是由同一用户名Shakilbit放置的,我有什么办法避免在同一条路径上将这些订单放在同一条路径上,谢谢!neo4j ..据我所知,社区非常有帮助。

使用APOC过程,您可能需要将收藏作为集合(消除重复值的情况)并比较大小。如果存在重复项,则集合的大小将较小。

MATCH p =(o:Order)-[r:seeks*2..8]->(o:Order)
WHERE o.Name="000093" AND ALL(x IN tail(nodes(p)) WHERE SINGLE(y IN    tail(nodes(p)) WHERE x=y))
WITH p, o, r, extract(u IN nodes(p)| u.UserName) AS UserName
// need to make some adjustments since first and last nodes are same
WHERE size(UserName) - 1 = size(apoc.coll.toSet(tail(UserName)))
RETURN extract(n IN nodes(p)| n.Name) AS OrderID, UserName, length(p), endNode(r[0])
ORDER BY length(p)

替代方案是重复您的ALL(x in tail...) WHERE single()...谓词,但在用户名集合中(或在您现有的All()谓词中包含此检查,尽管这可能很昂贵)。您可能需要介绍每个人,看看哪个更具性能。

最新更新