从 neo4j C# 客户端调用 algo.similarity.jaccard 算法不起作用



我有以下查询,当我在 Neoj4 浏览器上执行它时,它运行良好:

MATCH (p1:Book{friendlyUrl:"a-modern-witch"})-[r:BOOK_ADDED_TO_CATALOG]->(catalog1:Catalog)
WITH p1, collect(id(catalog1)) AS p1Catalog
MATCH (p2:Book)-[:BOOK_ADDED_TO_CATALOG]->(catalog2:Catalog)
WHERE p1 <> p2
WITH p1, p1Catalog, p2, collect(id(catalog2)) AS p2Catalog
RETURN p1.title AS from,
p2.title AS to,
algo.similarity.jaccard(p1Catalog, p2Catalog) AS similarity
ORDER BY similarity DESC

我想将其转换为 c# 代码,我这样做是这样的:

var result = _graphClient.Cypher
.Match ("(p1:Book{friendlyUrl:'a-modern-witch'})-[r:BOOK_ADDED_TO_CATALOG]->(catalog1:Catalog)")
.With ("p1, collect(id(catalog1)) AS p1Catalog")
.Match ("(p2:Book)-[:BOOK_ADDED_TO_CATALOG]->(catalog2:Catalog)")
.Where ("p1 <> p2")
.With ("p1, p1Catalog, p2, collect(id(catalog2)) AS p2Catalog")
.Call ("algo.similarity.jaccard(p1Catalog, p2Catalog)")
.Yield ("value AS similiarity")
.Return ((p1, p2, similiarity) => new {
bk1 = p1.As<BookDetailsDto> (),
bk2 = p2.As<BookDetailsDto> (),
})
.Limit (10);

不幸的是,当我通过API调用它时,我收到以下错误:

处理

请求时发生未处理的异常。 新异常:语法异常:类型不匹配:预期列表、列表或列表,但为列表(第 6 行,第 30 列(偏移量:327(( CALL algo.similarity.jaccard(p1Catalog, p2Catalog(

由neo4jClient构建的密码查询与顶部的原始查询完全不同:

MATCH (p1:Book{friendlyUrl:'harry-potter-and-the-deathly-hallows'})-[r:BOOK_ADDED_TO_CATALOG]->(catalog1:Catalog)
WITH p1, collect(id(catalog1)) AS p1Catalog
MATCH (p2:Book)-[:BOOK_ADDED_TO_CATALOG]->(catalog2:Catalog)
WHERE p1 <> p2
WITH p1, p1Catalog, p2, collect(id(catalog2)) AS p2Catalog
CALL algo.similarity.jaccard(p1Catalog, p2Catalog)
YIELD value AS similiarity
RETURN p1 AS bk, p2 AS bk2
LIMIT 10

好的,所以这有两个部分 - 为什么密码不匹配,以及错误意味着什么 - 它们都是相关的,但我们将首先解决密码差异 - 因为这会得到你的结果。

在你的密码中,你不会做CALL- 你只是RETURNJaccard,所以要真实地反映你的密码,你需要:

var result = _graphClient.Cypher
.Match ("(p1:Book{friendlyUrl:'a-modern-witch'})-[r:BOOK_ADDED_TO_CATALOG]->(catalog1:Catalog)")
.With ("p1, collect(id(catalog1)) AS p1Catalog")
.Match ("(p2:Book)-[:BOOK_ADDED_TO_CATALOG]->(catalog2:Catalog)")
.Where ("p1 <> p2")
.With ("p1, p1Catalog, p2, collect(id(catalog2)) AS p2Catalog")
.Return ((p1, p2, similiarity) => new {
bk1 = p1.As<BookDetailsDto> (),
bk2 = p2.As<BookDetailsDto> (),
similarity = Return.As<double>("algo.similarity.jaccard(p1Catalog, p2Catalog)")
})
.OrderByDescending("similarity")
.Limit (10);

其中的关键位是删除.Call错误、调用以及将Return.As<>用于算法调用。

第二部分 - (您收到的错误消息(与这种微妙的变化直接相关,通过使用CALL您从使用 Jaccard 的"函数"版本切换到"Prodedure"版本 - 它们具有不同的签名,函数版本如下所示:

"algo.similarity.jaccard(vector1 :: LIST? OF NUMBER?, vector2 :: LIST? OF NUMBER?) :: (FLOAT?)"

因此,它期望LIST? OF NUMBER?您的COLLECT(id(catalog))输出的内容。您可以通过在浏览器中运行以下密码来获取此信息:

CALL dbms.functions() YIELD name, signature, description
WHERE name CONTAINS 'jaccard'
RETURN *

现在,Prodedure 版本如下所示:

"algo.similarity.jaccard(data = null :: LIST? OF MAP?, config = {} :: MAP?) :: (nodes :: INTEGER?, sourceNodes :: INTEGER?, targetNodes :: INTEGER?, similarityPairs :: INTEGER?, computations :: INTEGER?, write :: BOOLEAN?, writeRelationshipType :: STRING?, writeProperty :: STRING?, min :: FLOAT?, max :: FLOAT?, mean :: FLOAT?, stdDev :: FLOAT?, p25 :: FLOAT?, p50 :: FLOAT?, p75 :: FLOAT?, p90 :: FLOAT?, p95 :: FLOAT?, p99 :: FLOAT?, p999 :: FLOAT?, p100 :: FLOAT?)"

这是在寻找一个LIST? OF MAP?-这不是你得到的 - 因此出现错误消息。

密码是:

CALL dbms.procedures() YIELD name, signature, description
WHERE name CONTAINS 'jaccard'
RETURN *

Anyhews - 第一个 C# 代码应该可以让你排序。

最新更新