Datomic 将谓词应用于基数很多的属性
Datomic apply predicate to attribute with cardinality many
假设我有一个具有多值属性(例如数字)的 Datomic 实体。我如何 return 其值不包含特定数字的实体列表?
例如,
{:db/id #db/id [:db.part/db]
:db/ident :strs
:db/valueType :db.type/string
:db/cardinality :db.cardinality/many
db.install/_attribute :db.part/db
}
我想找到列表中不包含数字 1 的所有实体。
If I do something like:
[:find ?e :where
[?e :strs ?v]
(not [(.contains ?v "b")])
]
但是我有
e1 :strs ["a", "b", "c"]
e2 :strs ["a", "b"]
e3 :strs ["h", "i", "j"]
然后所有实体都被 returned 因为查询被解释为
"find the entities who have a member of strs that doesn't contain "b"",
但我需要
"find the entities e for which every member does not contain "b"".
谢谢!
在 datomic 中 :cardinality/many
的值是 still stored as individual values under the hood。所以你的数据库中 e1
的事实是:
[[e1 :strs "a" tx]
[e1 :strs "b" tx]
[e1 :strs "c" tx]]
您可以在查询中利用它:
'[:find ?e
:where
[?e :strs]
(not [?e :strs "b"])]
这将找到数据库中所有事实的 ?e
的 :strs
值不为 "b"
的所有数据。
假设我有一个具有多值属性(例如数字)的 Datomic 实体。我如何 return 其值不包含特定数字的实体列表?
例如,
{:db/id #db/id [:db.part/db]
:db/ident :strs
:db/valueType :db.type/string
:db/cardinality :db.cardinality/many
db.install/_attribute :db.part/db
}
我想找到列表中不包含数字 1 的所有实体。
If I do something like:
[:find ?e :where
[?e :strs ?v]
(not [(.contains ?v "b")])
]
但是我有
e1 :strs ["a", "b", "c"]
e2 :strs ["a", "b"]
e3 :strs ["h", "i", "j"]
然后所有实体都被 returned 因为查询被解释为 "find the entities who have a member of strs that doesn't contain "b"", 但我需要
"find the entities e for which every member does not contain "b"".
谢谢!
在 datomic 中 :cardinality/many
的值是 still stored as individual values under the hood。所以你的数据库中 e1
的事实是:
[[e1 :strs "a" tx]
[e1 :strs "b" tx]
[e1 :strs "c" tx]]
您可以在查询中利用它:
'[:find ?e
:where
[?e :strs]
(not [?e :strs "b"])]
这将找到数据库中所有事实的 ?e
的 :strs
值不为 "b"
的所有数据。