我有以下查询,当我在 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
- 你只是RETURN
Jaccard,所以要真实地反映你的密码,你需要:
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# 代码应该可以让你排序。