Indexing Neo4j中是否可接受混合型索引?

Indexing Neo4j中是否可接受混合型索引?,indexing,neo4j,cypher,graph-databases,Indexing,Neo4j,Cypher,Graph Databases,我有一个数据集,其中包括许多节点,所有节点都标记为claim,它们可以具有各种属性(名称P1,P2,等等,通过P2000)。当前,声明节点中的每个节点只能有一个属性,每个属性都有值,值可以是不同的类型(即,P1可以是字符串,P2可以是浮点,P3整数,等等)。我还需要能够通过任何属性查找节点(即,“查找P3等于42的所有节点”) 我将其建模为具有属性值的节点,并根据p属性进行标记。然后我在标签claim和属性value上定义模式索引。然后,查找将类似于: MATCH (n:P569:claim)

我有一个数据集,其中包括许多节点,所有节点都标记为
claim
,它们可以具有各种属性(名称
P1
P2
,等等,通过
P2000
)。当前,
声明
节点中的每个节点只能有一个属性,每个属性都有值,值可以是不同的类型(即,
P1
可以是字符串,
P2
可以是浮点,
P3
整数,等等)。我还需要能够通过任何属性查找节点(即,
“查找P3等于42的所有节点”

我将其建模为具有属性
的节点,并根据p属性进行标记。然后我在标签
claim
和属性
value
上定义模式索引。然后,查找将类似于:

MATCH (n:P569:claim) WHERE n.value = 42 RETURN n
我的第一个问题是——有这样的索引可以吗?是否允许混合类型索引

第二个问题是,上面的查找是有效的(尽管我不确定它是否使用索引),但这不起作用-请注意,标签顺序已切换:

neo4j-sh (?)$ MATCH (n:claim:P569) WHERE n.value>0 RETURN n; 
IncomparableValuesException: Don't know how to compare that. Left: "113" (String); Right: 0 (Long)
P569
属性都是数字,但也有其他p值的字符串属性,其中一个是“113”。不知何故,尽管我说过标签应该是claim和P569,但“113”值仍然包含在比较中,即使它没有P569标签:

neo4j-sh (?)$ MATCH (n:claim) WHERE n.value ="113" RETURN LABELS(n);
+-------------------+
| LABELS(n)         |
+-------------------+
| ["claim","P1036"] |
| ["claim","P902"]  |
+-------------------+

这里有什么问题?为什么它只适用于一个标签订单而不适用于另一个?这个数据模型可以改进吗

至少让我试着回避你的问题,你可以用另一种方法来建模,至少可以解决你的一些问题

您正在将属性名称编码为标签。也许您希望这样做以加快查找应用该属性的节点子集;但是,将不可比较的数据值全部放入名为“value”的同一个属性中,似乎给您带来了很多困难

如果除了使用这些标签外,每个属性的名称都与值相同呢?即:

CREATE (n:P569:claim { P569: 42});
您仍然可以进行标签查找,但通过分离属性名称,可以保证查询计划器不会以构建执行计划的方式意外比较不可比较的值。您对该节点的查询将是:

MATCH (n:P569:claim) WHERE n.P569 > 5 AND n.P569 < 40 RETURN n;
匹配(n:P569:claim),其中n.P569>5和n.P569<40返回n;
请注意,如果您知道要使用的正确标签,则可以保证您知道要使用的正确属性名称。通过使用不同名称的属性,如果您以P569始终为整数的方式记录数据,那么您就不会出现无法比拟的情况。(我认为这是因为cypher执行该查询的特殊方式)


一个可能的缺点是,如果你必须对所有这些属性进行索引,那么它可能是很多索引,但仍然可能是需要考虑的事情。

< P>我认为退一步思考你真正想要达到的目标是有意义的。首先,为什么要有2000个属性,以及如何在图形中对它们进行不同的建模


另外,请确保只保留不需要的属性,并使用
coalesce()
来提供默认值。

据我所知,以不同的方式命名属性需要维护2000个索引,我的实验表明,尝试创建2000个索引会使Neo4j陷入停顿,并因OOM错误而崩溃。您的数据量是多少?您需要所有2000的索引吗?在一个属性中混合数据类型,似乎除非您非常仔细地规划查询,否则经常会出现比较不可比较的值的情况。在某些方面,这是对单个属性的误用,因为您将2000种不同的信息放在一个属性中。完整的数据量大约为100万项。是的,所有属性都需要索引。我尝试为所有2000个属性创建单独的索引,但在Lucene中打开的文件太多,即使将文件限制增加到100k。看起来您可以拥有的索引数量是有限制的。您可能不应该在您知道始终为整数的属性上创建lucene索引。考虑这样做:Lucene“遗留索引”是最好的,当你需要文本搜索,但可能不是数字范围搜索等。如果你想比较它们,你也可以在属性或ToTin()上使用toStutter()。索引可以有混合类型。您还可以使用索引n:claim(value)
通过
添加索引提示。在索引中,我认为值主要以可比较的格式(或字符串)存储。我有2000个属性,因为数据项可以有2000个不同的属性。我对如何在图表中最好地表示它们持开放态度。