我的Neo4j实例上的Cypher查询有问题。
我有以下图表结构:
(d:Document)-->(t:Token)-->(l:Lemma)
文档可以与许多令牌具有传出关系,而令牌始终存在 来自Document的一个传入关系。令牌总是只有一个 与引理的传出关系,而引理可以有多个传入的关系 来自Tokens。
所以基数为[Document]-n-1-[Token]-1-m-[Lemma]
。
我希望,对于给定列表documentIds
中的每个文档,计算不同标记的数量
和Lemmata在这种模式中,并将前者与后者分开。这应该考虑每个引理可以连接
在模式中的多个标记和这些Lemmata不应该被计为多个
次。
到目前为止,我的查询如下:
MATCH (d:DOCUMENT)--(t:TOKEN)--(l:LEMMA)
WHERE d.id in {documentIds}
WITH d, count(DISTINCT l)/count(DISTINCT t) AS ttr
RETURN d.id AS id, ttr
我觉得这会计算文档中的Lemmata和Tokens,
而不是分别计算每个文件。
我的结果ttr
中0.0
也是d.id
。
我不知道是否有办法向我提供我的数据库内容。是 查询中有一些明显的错误?
编辑:
我创建了一个控制台。
http://console.neo4j.org/r/yqtrbx
在这种情况下,有两个文档,其标记共享一个共同的引理。 对于此图表,我希望对于ID为10023的文档,结果为2/3,对于ID为10050的文档,结果为2/2。在完整文档中,令牌计数与引理计数之间的差异通常要高得多。
答案 0 :(得分:3)
您面临的问题与您正在划分两个整数并获得整数作为结果有关。这样,除法2/3将导致零而不是预期的0.66。要修复此问题,只需将其中一个整数转换为float,即:
match (d:DOCUMENT)-->(t:TOKEN)-->(l:LEMMA)
with d, count(distinct l) as cl, count(distinct t) as ct
return d, cl, ct, cl / toFloat(ct)
结果将是(基于您的数据集):
╒════════════╤════╤════╤══════════════════╕
│"d" │"cl"│"ct"│"cl / toFloat(ct)"│
╞════════════╪════╪════╪══════════════════╡
│{"id":10050}│2 │2 │1 │
├────────────┼────┼────┼──────────────────┤
│{"id":10023}│2 │3 │0.6666666666666666│
└────────────┴────┴────┴──────────────────┘