两个数之间的neo4j数

两个数之间的neo4j数,neo4j,cypher,Neo4j,Cypher,我的图形中有三个节点连接到一个节点:卡 在这种情况下,我已经匹配了用户的lvlPoints,并且在h.lvlPoints的实际查询中得到了它 当我意识到查询时,我如何知道用户必须检索pointsToWin的点数 MATCH (u:Person) WHERE u.name = "Jhon" MATCH (c:Company) WHERE c.name = "Some Company" MATCH (u)-[h:HAS_CARD]->(card:Card)-[:IS_FROM]->(c

我的图形中有三个节点连接到一个节点:卡

在这种情况下,我已经匹配了用户的lvlPoints,并且在h.lvlPoints的实际查询中得到了它

当我意识到查询时,我如何知道用户必须检索pointsToWin的点数

MATCH (u:Person)
WHERE u.name = "Jhon"
MATCH (c:Company)
WHERE c.name = "Some Company"

MATCH (u)-[h:HAS_CARD]->(card:Card)-[:IS_FROM]->(c)
MATCH (card)-[:HAS_LEVEL]->(lvl:Level)

// Now check for this ->  somelvl.points < h.lvlPoints < otherlvl.points
我知道我可以返回这些值,然后在客户端或服务器上对此进行必要的操作,但如果可能的话,我正在寻找一种密码解决方案

编辑:就我而言 -图形中有更多的级别具有相同的点值,但在点上有其他值存储或未连接到相同的:卡
-如果你有300分,你是一个普通级别,因为你有超过0分但低于500分银牌看起来你需要通用版本的:

所以你可以写一些像

// ...
CASE
  WHEN h.lvlPoints < 500  THEN "casual"
  WHEN h.lvlPoints < 1000 THEN "silver"
  ELSE                         "gold"
END
对于更一般的情况,如果可以有任意数量的级别,则应该用其他内容替换case。例如,您可以为列表中小于或等于lvlPoints的值指定一个值,然后取最后一个值。它应该是这样的:

// get u and h
// ...
MATCH (level:Level)
WITH u, h, level
ORDER BY level.points
WITH u, h, collect(level.points) AS points, collect(level.pointsToWin) AS pointsToWin
WITH
  u, CASE
    WHEN h.lvlPoints < points[1] THEN pointsToWin[0]
    WHEN h.lvlPoints < points[2] THEN pointsToWin[1]
    ELSE                              pointsToWin[2]
  END AS pointsEarned
RETURN u, pointsEarned
// ...
WITH filter(x IN points WHERE x <= h.lvlPoints) AS largerPoints
WITH largerPoints[length(largerPoints)-1] AS levelMinimumPoints
MATCH (level:Level {points: levelMinimumPoints})
// ...

看起来你有一些有用的东西,只是想提供一个替代方案

您应该能够使用匹配项和谓词,并快速使用排序和限制结果以获得所需的级别,而无需使用任何用例

MATCH (u:Person)
WHERE u.name = "Jhon"
MATCH (c:Company)
WHERE c.name = "Some Company"

MATCH (u)-[h:HAS_CARD]->(card:Card)-[:IS_FROM]->(c)
MATCH (card)-[:HAS_LEVEL]->(lvl:Level)

// above is directly from your description
// below should return, for the highest qualified level, its pointsToWin

WHERE lvl.points <= h.lvlPoints
WITH u, lvl
ORDER BY lvl.points DESC
LIMIT 1
RETURN u, lvl.pointsToWin

好的,这很好,但是。。我无法写入文字500、1000,因为这些数字可以修改,并且它们是在卡的:级别节点中定义的。我认为您的方式是正确的,但是我需要一些东西,比如h.lvlPoints// get u and h // ... MATCH (level:Level) WITH u, h, level ORDER BY level.points WITH u, h, collect(level.points) AS points, collect(level.pointsToWin) AS pointsToWin WITH u, CASE WHEN h.lvlPoints < points[1] THEN pointsToWin[0] WHEN h.lvlPoints < points[2] THEN pointsToWin[1] ELSE pointsToWin[2] END AS pointsEarned RETURN u, pointsEarned
// ...
WITH filter(x IN points WHERE x <= h.lvlPoints) AS largerPoints
WITH largerPoints[length(largerPoints)-1] AS levelMinimumPoints
MATCH (level:Level {points: levelMinimumPoints})
// ...
MATCH (u:Person)
WHERE u.name = "Jhon"
MATCH (c:Company)
WHERE c.name = "Some Company"

MATCH (u)-[h:HAS_CARD]->(card:Card)-[:IS_FROM]->(c)
MATCH (card)-[:HAS_LEVEL]->(lvl:Level)

// above is directly from your description
// below should return, for the highest qualified level, its pointsToWin

WHERE lvl.points <= h.lvlPoints
WITH u, lvl
ORDER BY lvl.points DESC
LIMIT 1
RETURN u, lvl.pointsToWin