āĻšāĻžāĻ āĻ¸āĻŦ. āĻāĻŽāĻ°āĻž āĻ āĻĢāĻ˛āĻžāĻāĻ¨ āĻā§āĻ°āĻžāĻĢāĻŋāĻ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻĒāĻŖā§āĻ¯ āĻŦāĻŋāĻāĻžāĻļ āĻāĻ°āĻāĻŋāĨ¤ āĻĒā§āĻ°āĻā§āĻā§āĻā§ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻ āĻā§āĻāĻ˛ā§ āĻĒāĻ°āĻŋāĻĻāĻ°ā§āĻļāĻ āĻ°ā§āĻā§āĻ° āĻĒāĻ°āĻŋāĻ¸āĻāĻā§āĻ¯āĻžāĻ¨āĻāĻ¤ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻāĻŋāĻ¤ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻ āĻāĻžāĻā§āĻ° āĻ āĻāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻ§āĻ°āĻŖā§āĻ° āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻĒā§āĻ°āĻļā§āĻ¨ āĻāĻŋāĻā§āĻāĻžāĻ¸āĻž āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
- āĻāĻ¤āĻāĻ¨ āĻĻāĻ°ā§āĻļāĻ "A" āĻāĻ˛āĻžāĻāĻž āĻĨā§āĻā§ "B" āĻāĻ˛āĻžāĻāĻžāĻ¯āĻŧ āĻāĻ˛ā§ āĻā§āĻā§;
- āĻāĻ¤āĻāĻ¨ āĻĻāĻ°ā§āĻļāĻ¨āĻžāĻ°ā§āĻĨā§ āĻāĻ˛āĻžāĻāĻž "A" āĻĨā§āĻā§ āĻāĻ˛āĻžāĻāĻž "B" āĻāĻ˛āĻžāĻāĻž "C" āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° "D" āĻāĻ˛āĻžāĻāĻž āĻĻāĻŋāĻ¯āĻŧā§ āĻā§āĻā§;
- āĻāĻ˛āĻžāĻāĻž "A" āĻĨā§āĻā§ "B" āĻāĻ˛āĻžāĻāĻžāĻ¯āĻŧ āĻ¯ā§āĻ¤ā§ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻĻāĻ°ā§āĻļāĻā§āĻ° āĻāĻ¤āĻā§āĻˇāĻŖ āĻ¸āĻŽāĻ¯āĻŧ āĻ˛āĻžāĻā§āĨ¤
āĻāĻŦāĻ āĻ āĻ¨ā§āĻ°ā§āĻĒ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖāĻžāĻ¤ā§āĻŽāĻ āĻĒā§āĻ°āĻļā§āĻ¨ āĻāĻāĻāĻŋ āĻ¸āĻāĻā§āĻ¯āĻž.
āĻāĻ˛āĻžāĻāĻž āĻā§āĻĄāĻŧā§ āĻĻāĻ°ā§āĻļāĻāĻĻā§āĻ° āĻāĻ˛āĻžāĻāĻ˛ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§āĻļāĻŋāĻ¤ āĻā§āĻ°āĻžāĻĢāĨ¤ āĻāĻ¨ā§āĻāĻžāĻ°āĻ¨ā§āĻ āĻĒāĻĄāĻŧāĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻŋ āĻāĻŦāĻŋāĻˇā§āĻāĻžāĻ° āĻāĻ°ā§āĻāĻŋ āĻ¯ā§ āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸āĻā§āĻ˛āĻŋ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖāĻŽā§āĻ˛āĻ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§āĻĻāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯āĻ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŽāĻžāĻ° āĻĻā§āĻāĻžāĻ° āĻāĻā§āĻāĻž āĻāĻŋāĻ˛ āĻāĻŋāĻāĻžāĻŦā§ āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸āĻā§āĻ˛āĻŋ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻĒā§āĻ°āĻļā§āĻ¨ā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽā§āĻāĻžāĻŦāĻŋāĻ˛āĻž āĻāĻ°āĻŦā§ (āĻāĻŋ āĻāĻ˛; āĻĄāĻŋāĻāĻ°; āĻĻā§āĻ°ā§āĻŦāĻ˛).
āĻāĻŽāĻŋ DBMS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻ¤ā§ āĻŦā§āĻā§ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋ
- BerkeleyDB āĻ¸ā§āĻā§āĻ°ā§āĻ āĻŦā§āĻ¯āĻžāĻāĻāĻ¨ā§āĻĄ, Apache Cassandra, Scylla;
- āĻāĻāĻŋāĻ˛ āĻ¸ā§āĻāĻāĻā§āĻ˛āĻŋ āĻ˛ā§āĻ¸āĻŋāĻ¨, āĻāĻ˛āĻžāĻ¸ā§āĻāĻŋāĻāĻ¸āĻžāĻ°ā§āĻ, āĻ¸ā§āĻ˛āĻžāĻ°ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
JanusGraph āĻāĻ° āĻ˛ā§āĻāĻāĻ°āĻž āĻ˛āĻŋāĻā§āĻā§āĻ¨ āĻ¯ā§ āĻāĻāĻŋ OLTP āĻāĻŦāĻ OLAP āĻāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯āĻ āĻāĻĒāĻ¯ā§āĻā§āĻ¤āĨ¤
āĻāĻŽāĻŋ BerkeleyDB, Apache Cassandra, Scylla āĻāĻŦāĻ ES āĻāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°ā§āĻāĻŋ āĻāĻŦāĻ āĻāĻ āĻĒāĻŖā§āĻ¯āĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻ āĻā§āĻ°āĻžāĻĢ DBMS āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻŦāĻŋāĻˇāĻ¯āĻŧā§ āĻāĻļāĻžāĻŦāĻžāĻĻā§ āĻāĻŋāĻ˛āĻžāĻŽāĨ¤ āĻ°āĻāĻ¸āĻĄāĻŋāĻŦāĻŋ-āĻ° āĻāĻĒāĻ° āĻŦāĻžāĻ°ā§āĻāĻ˛ā§āĻĄāĻŋāĻŦāĻŋ āĻŦā§āĻā§ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻāĻŽāĻžāĻ° āĻāĻžāĻā§ āĻ āĻĻā§āĻā§āĻ¤ āĻŽāĻ¨ā§ āĻšāĻ¯āĻŧā§āĻā§, āĻ¤āĻŦā§ āĻāĻāĻŋ āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻ˛ā§āĻ¨āĻĻā§āĻ¨ā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧāĻ¤āĻžāĻ° āĻāĻžāĻ°āĻŖā§āĨ¤ āĻ¯ā§ āĻā§āĻ¨ā§ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻ¸ā§āĻā§āĻ˛āĻ¯ā§āĻā§āĻ¯, āĻĒāĻŖā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯, āĻā§āĻ¯āĻžāĻ¸āĻžāĻ¨ā§āĻĻā§āĻ°āĻž āĻŦāĻž āĻ¸āĻŋāĻ˛āĻžāĻ° āĻāĻĒāĻ° āĻāĻāĻāĻŋ āĻŦā§āĻ¯āĻžāĻāĻāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻŽāĻŋ Neo4j āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°āĻŋāĻ¨āĻŋ āĻāĻžāĻ°āĻŖ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ°āĻŋāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻŦāĻžāĻŖāĻŋāĻā§āĻ¯āĻŋāĻ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨, āĻ āĻ°ā§āĻĨāĻžā§ āĻĒāĻŖā§āĻ¯āĻāĻŋ āĻāĻĒā§āĻ¨ āĻ¸ā§āĻ°ā§āĻ¸ āĻ¨āĻ¯āĻŧāĨ¤
āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸ āĻŦāĻ˛ā§: "āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢā§āĻ° āĻŽāĻ¤ā§ āĻĻā§āĻāĻžāĻ¯āĻŧ āĻ¤āĻŦā§ āĻāĻāĻŋāĻā§ āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢā§āĻ° āĻŽāĻ¤ā§ āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°ā§āĻ¨!" - āĻ¸ā§āĻ¨ā§āĻĻāĻ°ā§āĻ¯!
āĻĒā§āĻ°āĻĨāĻŽā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢ āĻāĻāĻāĻ˛āĻžāĻŽ, āĻ¯āĻž āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸-āĻāĻ° āĻā§āĻ¯āĻžāĻ¨āĻ¨ āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛:
āĻāĻāĻāĻž āĻ¸āĻžāĻ°āĻŽāĻ°ā§āĻŽ āĻāĻā§ Zone
, āĻāĻ˛āĻžāĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĻāĻžāĻ¯āĻŧā§. āĻ¯āĻĻāĻŋ ZoneStep
āĻāĻ āĻ
āĻ¨ā§āĻ¤āĻ°ā§āĻāĻ¤ Zone
, āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¤āĻŋāĻ¨āĻŋ āĻāĻāĻŋ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°ā§āĻ¨. āĻ¸āĻžāĻ°āĻžāĻāĻļ Area
, ZoneTrack
, Person
āĻŽāĻ¨ā§āĻ¯ā§āĻ āĻĻā§āĻŦā§āĻ¨ āĻ¨āĻž, āĻ¤āĻžāĻ°āĻž āĻĄā§āĻŽā§āĻ¨ā§āĻ° āĻ
āĻ¨ā§āĻ¤āĻ°ā§āĻāĻ¤ āĻāĻŦāĻ āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻ° āĻ
āĻāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻŦāĻŋāĻŦā§āĻāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻŽā§āĻ, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢ āĻāĻžāĻ āĻžāĻŽā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻā§āĻāĻ¨ āĻ
āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§ āĻĻā§āĻāĻ¤ā§ āĻšāĻŦā§:
g.V().hasLabel('Zone').has('id',0).in_()
.repeat(__.out()).until(__.out().hasLabel('Zone').has('id',19)).count().next()
āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻ¯āĻž āĻāĻāĻ°āĻāĻŽ: ID=0 āĻ¸āĻš āĻāĻāĻāĻŋ āĻ āĻā§āĻāĻ˛ āĻā§āĻāĻā§āĻ¨, āĻ¯ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻļā§āĻ°ā§āĻˇāĻŦāĻŋāĻ¨ā§āĻĻā§ āĻĨā§āĻā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻāĻāĻŋāĻ¤ā§ āĻ¯āĻžāĻ¯āĻŧ āĻ¸ā§āĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ¨ (āĻā§āĻ¨āĻ¸ā§āĻā§āĻĒ), āĻ¯āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻāĻĒāĻ¨āĻŋ āĻ¸ā§āĻ āĻā§āĻ¨āĻ¸ā§āĻā§āĻĒāĻā§āĻ˛āĻŋ āĻā§āĻāĻā§ āĻ¨āĻž āĻĒāĻžāĻ¨ āĻ¯ā§āĻāĻžāĻ¨ āĻĨā§āĻā§ āĻā§āĻ¨ā§āĻ° āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻ°āĻ¯āĻŧā§āĻā§ ID=19, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻā§āĻāĻ¨ āĻ¸āĻāĻā§āĻ¯āĻž āĻāĻŖāĻ¨āĻž āĻāĻ°ā§āĻ¨āĨ¤
āĻāĻŽāĻŋ āĻā§āĻ°āĻžāĻĢā§ āĻ
āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻāĻŋāĻ˛āĻ¤āĻž āĻāĻžāĻ¨āĻžāĻ° āĻāĻžāĻ¨ āĻāĻ°āĻŋ āĻ¨āĻž, āĻ¤āĻŦā§ āĻāĻ āĻĒā§āĻ°āĻļā§āĻ¨āĻāĻŋ āĻāĻ āĻŦāĻāĻāĻŋāĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛ (
āĻāĻŽāĻŋ BerkeleyDB āĻŦā§āĻ¯āĻžāĻāĻāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻāĻŋ JanusGraph āĻā§āĻ°āĻžāĻĢ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ 50 āĻĨā§āĻā§ 3 āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻĻā§āĻ°ā§āĻā§āĻ¯ā§āĻ° 20 āĻšāĻžāĻāĻžāĻ° āĻā§āĻ°ā§āĻ¯āĻžāĻ āĻ˛ā§āĻĄ āĻāĻ°ā§āĻāĻŋ, āĻ
āĻ¨ā§āĻ¯āĻžāĻ¯āĻŧā§ āĻ¸ā§āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋ
āĻĒāĻžāĻāĻĨāĻ¨ āĻĄāĻžāĻāĻ¨āĻ˛ā§āĻĄ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ:
from random import random
from time import time
from init import g, graph
if __name__ == '__main__':
points = []
max_zones = 19
zcache = dict()
for i in range(0, max_zones + 1):
zcache[i] = g.addV('Zone').property('id', i).next()
startZ = zcache[0]
endZ = zcache[max_zones]
for i in range(0, 10000):
if not i % 100:
print(i)
start = g.addV('ZoneStep').property('time', int(time())).next()
g.V(start).addE('belongs').to(startZ).iterate()
while True:
pt = g.addV('ZoneStep').property('time', int(time())).next()
end_chain = random()
if end_chain < 0.3:
g.V(pt).addE('belongs').to(endZ).iterate()
g.V(start).addE('goes').to(pt).iterate()
break
else:
zone_id = int(random() * max_zones)
g.V(pt).addE('belongs').to(zcache[zone_id]).iterate()
g.V(start).addE('goes').to(pt).iterate()
start = pt
count = g.V().count().next()
print(count)
āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ SSD-āĻ¤ā§ 4 āĻā§āĻ° āĻāĻŦāĻ 16 GB RAM āĻ¸āĻš āĻāĻāĻāĻŋ VM āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§āĻāĻŋāĨ¤ JanusGraph āĻāĻ āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛:
docker run --name janusgraph -p8182:8182 janusgraph/janusgraph:latest
āĻāĻ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻ¸āĻ āĻŋāĻ āĻŽāĻŋāĻ˛ āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻĄā§āĻāĻž āĻāĻŦāĻ āĻ¸ā§āĻā§āĻā§āĻ˛āĻŋ āĻŦāĻžāĻ°ā§āĻāĻ˛ā§āĻĄāĻŋāĻŦāĻŋāĻ¤ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻāĻā§ āĻĻā§āĻāĻ¯āĻŧāĻž āĻ āĻ¨ā§āĻ°ā§āĻ§āĻāĻŋ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻŋ āĻāĻ¯āĻŧā§āĻ āĻĻāĻļ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻ¸āĻŽāĻžāĻ¨ āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¯āĻŧ āĻĒā§āĻ¯āĻŧā§āĻāĻŋāĨ¤
āĻāĻĒāĻ°ā§āĻ° ā§ĒāĻāĻŋ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻāĻžāĻŦā§ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§, āĻāĻŽāĻŋ āĻĄāĻāĻžāĻ° āĻ˛āĻā§ āĻāĻžāĻāĻž āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻā§āĻ°ā§āĻ¸ā§āĻ° (āĻāĻŦāĻ āĻāĻŽāĻ°āĻž āĻ¸āĻŦāĻžāĻ āĻāĻžāĻāĻž āĻ¸ā§āĻā§āĻ¯āĻžāĻāĻā§āĻ°ā§āĻ¸ āĻĒāĻĄāĻŧāĻ¤ā§ āĻĒāĻāĻ¨ā§āĻĻ āĻāĻ°āĻŋ) āĻāĻ° āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻĢā§āĻ˛ā§āĻ˛ āĻ¸ā§āĻ°ā§āĻ¤ā§ DBMS āĻā§ āĻā§āĻŽāĻĄāĻŧāĻžāĻ¤ā§ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻāĻ°āĻ¤ā§ āĻĒā§āĻ°ā§āĻāĻŋāĨ¤
āĻāĻŋāĻā§ āĻāĻŋāĻ¨ā§āĻ¤āĻž āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻŋ āĻā§āĻ°āĻžāĻĢ āĻĄāĻžāĻ¯āĻŧāĻžāĻā§āĻ°āĻžāĻŽāĻāĻŋāĻā§ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤āĻā§āĻ˛āĻŋāĻ¤ā§ āĻ¸āĻ°āĻ˛ āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋ:
āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨ā§āĻāĻ¯āĻŧāĻž āĻ¯ā§ āĻ¸āĻ¤ā§āĻ¤āĻž āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻž āĻĒā§āĻ°āĻžāĻ¨ā§āĻ¤ āĻĻā§āĻŦāĻžāĻ°āĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻā§āĻ¯āĻŧā§ āĻĻā§āĻ°ā§āĻ¤āĻ¤āĻ° āĻšāĻŦā§ā§ˇ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻžāĻ° āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŖāĻ¤ āĻšāĻ¯āĻŧā§āĻā§:
g.V().hasLabel('ZoneStep').has('id',0).repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',19)).count().next()
āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻ¯āĻž āĻāĻāĻ°āĻāĻŽ: ID=0 āĻĻāĻŋāĻ¯āĻŧā§ ZoneStep āĻā§āĻāĻā§āĻ¨, āĻ¯āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻāĻĒāĻ¨āĻŋ ID=19-āĻāĻ° āĻ¸āĻžāĻĨā§ ZoneStep āĻā§āĻāĻā§ āĻ¨āĻž āĻĒāĻžāĻ¨ āĻ¤āĻ¤āĻā§āĻˇāĻŖ āĻ¨āĻž āĻĢāĻŋāĻ°ā§ āĻ¸ā§āĻāĻŽā§āĻĒ āĻāĻ°ā§āĻ¨, āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻā§āĻāĻ¨ā§āĻ° āĻ¸āĻāĻā§āĻ¯āĻž āĻāĻŖāĻ¨āĻž āĻāĻ°ā§āĻ¨āĨ¤
āĻāĻŽāĻŋ āĻāĻĒāĻ°ā§ āĻĒā§āĻ°āĻĻāĻ¤ā§āĻ¤ āĻ˛ā§āĻĄāĻŋāĻ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻāĻāĻŋ āĻ¸āĻ°āĻ˛ā§āĻā§āĻ¤ āĻāĻ°ā§āĻāĻŋ āĻ¯āĻžāĻ¤ā§ āĻ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¸āĻāĻ¯ā§āĻ āĻ¤ā§āĻ°āĻŋ āĻ¨āĻž āĻšāĻ¯āĻŧ, āĻ¨āĻŋāĻā§āĻā§ āĻā§āĻŖāĻžāĻŦāĻ˛ā§āĻ¤ā§ āĻ¸ā§āĻŽāĻžāĻŦāĻĻā§āĻ§ āĻāĻ°ā§āĨ¤
āĻ āĻ¨ā§āĻ°ā§āĻ§āĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻšāĻ¤ā§ āĻāĻāĻ¨āĻ āĻāĻ¯āĻŧā§āĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄ āĻ¸āĻŽāĻ¯āĻŧ āĻ˛ā§āĻā§āĻāĻŋāĻ˛, āĻ¯āĻž āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻžāĻā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§ āĻ āĻā§āĻ°āĻšāĻŖāĻ¯ā§āĻā§āĻ¯ āĻāĻŋāĻ˛, āĻ¯ā§āĻšā§āĻ¤ā§ āĻāĻāĻŋ āĻā§āĻ¨ā§ āĻ§āĻ°āĻ¨ā§āĻ° AdHoc āĻ āĻ¨ā§āĻ°ā§āĻ§ā§āĻ° āĻāĻĻā§āĻĻā§āĻļā§āĻ¯ā§ āĻŽā§āĻā§āĻ āĻāĻĒāĻ¯ā§āĻā§āĻ¤ āĻāĻŋāĻ˛ āĻ¨āĻžāĨ¤
āĻāĻŽāĻŋ āĻĻā§āĻ°ā§āĻ¤āĻ¤āĻŽ āĻā§āĻ¯āĻžāĻ¸āĻžāĻ¨ā§āĻĻā§āĻ°āĻž āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ Scylla āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ JanusGraph āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°ā§āĻāĻŋ, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŋ āĻā§āĻ¨ āĻāĻ˛ā§āĻ˛ā§āĻāĻ¯ā§āĻā§āĻ¯ āĻāĻ°ā§āĻŽāĻā§āĻˇāĻŽāĻ¤āĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻĻāĻŋāĻā§ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻŋāĻ¤ āĻāĻ°ā§āĻ¨āĻŋāĨ¤
āĻ¤āĻžāĻ "āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢā§āĻ° āĻŽāĻ¤ā§ āĻĻā§āĻāĻžāĻ¯āĻŧ" āĻ¸āĻ¤ā§āĻ¤ā§āĻŦā§āĻ, āĻāĻŽāĻŋ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ°āĻžāĻĢ DBMS āĻĒā§āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĻ¨āĻŋāĨ¤ āĻāĻŽāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§ āĻ āĻ¨ā§āĻŽāĻžāĻ¨ āĻāĻ°āĻŋ āĻ¯ā§ āĻāĻŽāĻ¨ āĻāĻŋāĻā§ āĻāĻā§ āĻ¯āĻž āĻāĻŽāĻŋ āĻāĻžāĻ¨āĻŋ āĻ¨āĻž āĻāĻŦāĻ JanusGraph āĻāĻ āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨āĻāĻŋ āĻāĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻāĻā§āĻ¨āĻžāĻāĻļā§ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§, āĻ¤āĻŦā§, āĻāĻŽāĻŋ āĻāĻāĻŋ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻāĻŋāĻ˛āĻžāĻŽ āĻ¨āĻžāĨ¤
āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻāĻŋ āĻāĻāĻ¨āĻ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻž āĻĻāĻ°āĻāĻžāĻ°, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻ¯ā§āĻāĻĻāĻžāĻ¨ āĻāĻŦāĻ āĻā§āĻŦāĻŋāĻ˛ā§āĻ° āĻĒāĻŋāĻāĻ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻŋāĻ¨ā§āĻ¤āĻž āĻāĻ°āĻ¤ā§ āĻļā§āĻ°ā§ āĻāĻ°ā§āĻāĻŋ, āĻ¯āĻž āĻāĻŽāĻ¨ā§āĻ¯āĻŧāĻ¤āĻžāĻ° āĻĒāĻ°āĻŋāĻĒā§āĻ°ā§āĻā§āĻˇāĻŋāĻ¤ā§ āĻāĻļāĻžāĻŦāĻžāĻĻāĻā§ āĻ āĻ¨ā§āĻĒā§āĻ°āĻžāĻŖāĻŋāĻ¤ āĻāĻ°ā§ āĻ¨āĻž, āĻ¤āĻŦā§ āĻ āĻ¨ā§āĻļā§āĻ˛āĻ¨ā§ āĻāĻāĻāĻŋ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ āĻāĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§ Apache ClickHouse āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻ¤āĻžāĻ āĻāĻŽāĻŋ āĻāĻ āĻŦāĻŋāĻļā§āĻ˛ā§āĻˇāĻŖāĻžāĻ¤ā§āĻŽāĻ DBMS-āĻ āĻāĻŽāĻžāĻ° āĻāĻŦā§āĻˇāĻŖāĻž āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋāĨ¤
āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ°ā§āĻ¸āĻŋāĻĒāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻā§āĻ˛āĻŋāĻāĻšāĻžāĻāĻ¸ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§:
sudo docker run -d --name clickhouse_1
--ulimit nofile=262144:262144
-v /opt/clickhouse/log:/var/log/clickhouse-server
-v /opt/clickhouse/data:/var/lib/clickhouse
yandex/clickhouse-server
āĻāĻŽāĻŋ āĻāĻāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻā§āĻŦāĻŋāĻ˛ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻāĻŋ:
CREATE TABLE
db.steps (`area` Int64, `when` DateTime64(1, 'Europe/Moscow') DEFAULT now64(), `zone` Int64, `person` Int64)
ENGINE = MergeTree() ORDER BY (area, zone, person) SETTINGS index_granularity = 8192
āĻāĻŽāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻ¸ā§āĻā§āĻ°āĻŋāĻĒā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻĄā§āĻāĻž āĻĻāĻŋāĻ¯āĻŧā§ āĻāĻāĻŋ āĻĒā§āĻ°āĻŖ āĻāĻ°ā§āĻāĻŋ:
from time import time
from clickhouse_driver import Client
from random import random
client = Client('vm-12c2c34c-df68-4a98-b1e5-a4d1cef1acff.domain',
database='db',
password='secret')
max = 20
for r in range(0, 100000):
if r % 1000 == 0:
print("CNT: {}, TS: {}".format(r, time()))
data = [{
'area': 0,
'zone': 0,
'person': r
}]
while True:
if random() < 0.3:
break
data.append({
'area': 0,
'zone': int(random() * (max - 2)) + 1,
'person': r
})
data.append({
'area': 0,
'zone': max - 1,
'person': r
})
client.execute(
'INSERT INTO steps (area, zone, person) VALUES',
data
)
āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļāĻā§āĻ˛āĻŋ āĻŦā§āĻ¯āĻžāĻā§ āĻāĻ¸ā§, āĻ¤āĻžāĻ JanusGraph-āĻāĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻĢāĻŋāĻ˛āĻŋāĻ āĻ āĻ¨ā§āĻ āĻĻā§āĻ°ā§āĻ¤ āĻāĻŋāĻ˛ā§ˇ
JOIN āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻĻā§āĻāĻŋ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻā§āĨ¤ āĻŦāĻŋāĻ¨ā§āĻĻā§ A āĻĨā§āĻā§ āĻŦāĻŋ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§ āĻ¯ā§āĻ¤ā§:
SELECT s1.person AS person,
s1.zone,
s1.when,
s2.zone,
s2.when
FROM
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 0)) AS s1 ANY INNER JOIN
(SELECT *
FROM steps AS s2
WHERE (area = 0)
AND (zone = 19)) AS s2 USING person
WHERE s1.when <= s2.when
3 āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻŽāĻ§ā§āĻ¯ āĻĻāĻŋāĻ¯āĻŧā§ āĻ¯ā§āĻ¤ā§:
SELECT s3.person,
s1z,
s1w,
s2z,
s2w,
s3.zone,
s3.when
FROM
(SELECT s1.person AS person,
s1.zone AS s1z,
s1.when AS s1w,
s2.zone AS s2z,
s2.when AS s2w
FROM
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 0)) AS s1 ANY INNER JOIN
(SELECT *
FROM steps AS s2
WHERE (area = 0)
AND (zone = 3)) AS s2 USING person
WHERE s1.when <= s2.when) p ANY INNER JOIN
(SELECT *
FROM steps
WHERE (area = 0)
AND (zone = 19)) AS s3 USING person
WHERE p.s2w <= s3.when
āĻ āĻ¨ā§āĻ°ā§āĻ§āĻā§āĻ˛āĻŋ, āĻ āĻŦāĻļā§āĻ¯āĻ, āĻŦā§āĻļ āĻā§āĻ¤āĻŋāĻāĻ° āĻĻā§āĻāĻžāĻā§āĻā§; āĻŦāĻžāĻ¸ā§āĻ¤āĻŦ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻāĻāĻŋ āĻ¸āĻĢā§āĻāĻāĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻā§āĻ¨āĻžāĻ°ā§āĻāĻ° āĻā§āĻ¤āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻ¤āĻžāĻ°āĻž āĻāĻžāĻ āĻāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻž āĻĻā§āĻ°ā§āĻ¤ āĻāĻžāĻ āĻāĻ°ā§āĨ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻāĻŦāĻ āĻĻā§āĻŦāĻŋāĻ¤ā§āĻ¯āĻŧ āĻāĻāĻ¯āĻŧ āĻ āĻ¨ā§āĻ°ā§āĻ§āĻ 0.1 āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻāĻŽ āĻ¸āĻŽāĻ¯āĻŧā§ āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ¯āĻŧāĨ¤ āĻāĻŖāĻ¨āĻž (*) 3 āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻŽāĻ§ā§āĻ¯ āĻĻāĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻāĻ¯āĻŧāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ¯ā§āĻ¯āĻŧāĻžāĻ°ā§ āĻāĻā§āĻ¸āĻŋāĻāĻŋāĻāĻļāĻ¨ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻāĻāĻžāĻ¨ā§ āĻĻā§āĻāĻ¯āĻŧāĻž āĻšāĻ˛:
SELECT count(*)
FROM
(
SELECT
s1.person AS person,
s1.zone AS s1z,
s1.when AS s1w,
s2.zone AS s2z,
s2.when AS s2w
FROM
(
SELECT *
FROM steps
WHERE (area = 0) AND (zone = 0)
) AS s1
ANY INNER JOIN
(
SELECT *
FROM steps AS s2
WHERE (area = 0) AND (zone = 3)
) AS s2 USING (person)
WHERE s1.when <= s2.when
) AS p
ANY INNER JOIN
(
SELECT *
FROM steps
WHERE (area = 0) AND (zone = 19)
) AS s3 USING (person)
WHERE p.s2w <= s3.when
ââcount()ââ
â 11592 â
âââââââââââ
1 rows in set. Elapsed: 0.068 sec. Processed 250.03 thousand rows, 8.00 MB (3.69 million rows/s., 117.98 MB/s.)
IOPS āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻāĻāĻŋ āĻ¨ā§āĻ. āĻĄā§āĻāĻž āĻĒāĻĒā§āĻ˛ā§āĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, JanusGraph āĻāĻāĻāĻŋ āĻŽā§āĻāĻžāĻŽā§āĻāĻŋ āĻāĻā§āĻ āĻ¸āĻāĻā§āĻ¯āĻ IOPS āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻā§ (āĻāĻžāĻ°āĻāĻŋ āĻĄā§āĻāĻž āĻāĻ¨āĻ¸āĻāĻā§āĻ¯āĻž āĻĨā§āĻ°ā§āĻĄā§āĻ° āĻāĻ¨ā§āĻ¯ 1000-1300) āĻāĻŦāĻ IOWAIT āĻŦā§āĻļ āĻŦā§āĻļāĻŋ āĻāĻŋāĻ˛āĨ¤ āĻāĻāĻ āĻ¸āĻŽāĻ¯āĻŧā§, āĻā§āĻ˛āĻŋāĻ āĻšāĻžāĻāĻ¸ āĻĄāĻŋāĻ¸ā§āĻ āĻ¸āĻžāĻŦāĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§ āĻ¨ā§āĻ¯ā§āĻ¨āĻ¤āĻŽ āĻ˛ā§āĻĄ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻā§āĨ¤
āĻāĻĒāĻ¸āĻāĻšāĻžāĻ°
āĻāĻŽāĻ°āĻž āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻ āĻ¨ā§āĻ°ā§āĻ§ā§āĻ° āĻāĻ¨ā§āĻ¯ ClickHouse āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¯āĻŧā§āĻāĻŋāĨ¤ āĻā§āĻ˛āĻŋāĻāĻšāĻžāĻāĻ¸ā§ āĻ˛ā§āĻĄ āĻāĻ°āĻžāĻ° āĻāĻā§ āĻ ā§āĻ¯āĻžāĻĒāĻžāĻāĻŋ āĻĢā§āĻ˛āĻŋāĻā§āĻ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻā§āĻ¨ā§āĻ āĻ¸ā§āĻā§āĻ°ā§āĻŽāĻā§ āĻĒā§āĻ°āĻžāĻ-āĻĒā§āĻ°āĻ¸ā§āĻ¸āĻŋāĻ āĻāĻ°ā§ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻ¤ āĻĻā§āĻˇā§āĻāĻŋāĻāĻā§āĻāĻŋ āĻāĻŦāĻ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛āĻāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻŽāĻ°āĻž āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻĒā§āĻ°āĻļā§āĻ¨āĻā§āĻ˛āĻŋāĻā§ āĻāĻ°āĻ āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŋāĨ¤
āĻĒāĻžāĻ°āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¸āĻāĻŋ āĻāĻ¤ āĻāĻžāĻ˛ āĻ¯ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻŽā§āĻāĻŦāĻ¤ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻāĻ¤āĻāĻžāĻŦā§ āĻĒāĻŋāĻā§āĻāĻŋāĻ āĻā§āĻŦāĻŋāĻ˛āĻā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻžāĻŦāĻ¤ā§ āĻšāĻŦā§ āĻ¨āĻžāĨ¤ āĻĒā§āĻ°ā§āĻŦā§, āĻāĻŽāĻžāĻĻā§āĻ° Apache Parquet-āĻ āĻāĻĒāĻ˛ā§āĻĄā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ āĻāĻžāĻ°ā§āĻāĻŋāĻāĻž āĻĨā§āĻā§ āĻĒā§āĻ¨āĻ°ā§āĻĻā§āĻ§āĻžāĻ° āĻāĻ°āĻž āĻĄā§āĻāĻžāĻ° āĻĒāĻŋāĻāĻāĻā§āĻ˛āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛āĨ¤
āĻĻā§āĻ°ā§āĻāĻžāĻā§āĻ¯āĻŦāĻļāĻ¤, āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢ DBMS āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻ°ā§āĻāĻāĻŋ āĻĒā§āĻ°āĻā§āĻˇā§āĻāĻž āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻāĻŽāĻŋ JanusGraph-āĻāĻ° āĻāĻžāĻā§ āĻāĻāĻāĻŋ āĻŦāĻ¨ā§āĻ§ā§āĻ¤ā§āĻŦāĻĒā§āĻ°ā§āĻŖ āĻāĻā§āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻā§āĻāĻā§ āĻĒāĻžāĻāĻ¨āĻŋ āĻ¯āĻž āĻĒāĻŖā§āĻ¯ā§āĻ° āĻ¸āĻžāĻĨā§ āĻĻā§āĻ°ā§āĻ¤ āĻāĻ¤āĻŋāĻ¤ā§ āĻāĻ āĻ¤ā§ āĻ¸āĻšāĻ āĻāĻ°ā§ āĻ¤ā§āĻ˛ā§āĨ¤ āĻāĻāĻ āĻ¸āĻŽāĻ¯āĻŧā§, āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻ¤āĻŋāĻšā§āĻ¯āĻāĻ¤ āĻāĻžāĻāĻž āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯āĻž āĻāĻžāĻāĻž-āĻāĻ° āĻ¸āĻžāĻĨā§ āĻĒāĻ°āĻŋāĻāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ āĻāĻŽāĻ¨ āĻ˛ā§āĻā§āĻĻā§āĻ° āĻ°āĻā§āĻ¤ā§āĻ° āĻ āĻļā§āĻ°ā§ āĻāĻžāĻāĻĻāĻžāĻŦā§:
host: 0.0.0.0
port: 8182
threadPoolWorker: 1
gremlinPool: 8
scriptEvaluationTimeout: 30000
channelizer: org.janusgraph.channelizers.JanusGraphWsAndHttpChannelizer
graphManager: org.janusgraph.graphdb.management.JanusGraphManager
graphs: {
ConfigurationManagementGraph: conf/janusgraph-cql-configurationgraph.properties,
airlines: conf/airlines.properties
}
scriptEngines: {
gremlin-groovy: {
plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {files: [scripts/airline-sample.groovy]}}}}
serializers:
# GraphBinary is here to replace Gryo and Graphson
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphBinaryMessageSerializerV1, config: { serializeResultToString: true }}
# Gryo and Graphson, latest versions
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV3d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV3d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
# Older serialization versions for backwards compatibility:
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
- { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistryV1d0] }}
processors:
- { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
- { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
metrics: {
consoleReporter: {enabled: false, interval: 180000},
csvReporter: {enabled: false, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
jmxReporter: {enabled: false},
slf4jReporter: {enabled: true, interval: 180000},
gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
graphiteReporter: {enabled: false, interval: 180000}}
threadPoolBoss: 1
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferHighWaterMark: 32768
writeBufferHighWaterMark: 65536
ssl: {
enabled: false}
āĻāĻŽāĻŋ āĻāĻāĻ¨āĻžāĻā§āĻ°āĻŽā§ JanusGraph āĻāĻ° BerkeleyDB āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻāĻŋ "āĻĒā§āĻ" āĻāĻ°āĻ¤ā§ āĻĒā§āĻ°ā§āĻāĻŋāĨ¤
āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨āĻāĻŋ āĻ¸ā§āĻā§āĻā§āĻ˛āĻŋāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻŦā§āĻļ āĻā§āĻāĻŋāĻ˛, āĻ¯ā§āĻšā§āĻ¤ā§ āĻ¸ā§āĻā§āĻā§āĻ˛āĻŋ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¨āĻžāĻā§ āĻā§āĻ°ā§āĻāĻŋāĻ¤ā§ āĻāĻŋāĻā§ āĻ āĻĻā§āĻā§āĻ¤ āĻļāĻžāĻŽāĻžāĻ¨āĻŦāĻžāĻĻ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻā§āĻ°ā§āĻŽāĻ˛āĻŋāĻ¨ āĻāĻ¨āĻ¸ā§āĻ˛ā§ āĻā§āĻĄ āĻ˛āĻŋāĻā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻāĻ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ (āĻ¯āĻž, āĻŦāĻžāĻā§āĻ¸ā§āĻ° āĻŦāĻžāĻāĻ°ā§ āĻāĻžāĻ āĻāĻ°ā§ āĻ¨āĻž)āĨ¤ āĻ¸āĻ°āĻāĻžāĻ°ā§ JanusGraph āĻĄāĻā§āĻŽā§āĻ¨ā§āĻā§āĻļāĻ¨ āĻĨā§āĻā§:
graph.tx().rollback() //Never create new indexes while a transaction is active
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
age = mgmt.getPropertyKey('age')
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex()
mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
mgmt.commit()
//Wait for the index to become available
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameComposite').call()
ManagementSystem.awaitGraphIndexStatus(graph, 'byNameAndAgeComposite').call()
//Reindex the existing data
mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get()
mgmt.commit()
āĻāĻ¤ā§āĻ¤āĻ°āĻāĻžāĻˇ
āĻāĻ āĻ āĻ°ā§āĻĨā§, āĻāĻĒāĻ°ā§āĻ° āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻāĻŋ āĻāĻˇā§āĻŖ āĻāĻŦāĻ āĻ¨āĻ°āĻŽā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻ¤ā§āĻ˛āĻ¨āĻžāĨ¤ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻŋāĻ¨ā§āĻ¤āĻž āĻāĻ°ā§āĻ¨, āĻāĻāĻāĻŋ āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸ āĻāĻāĻ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĒā§āĻ¤ā§ āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ˛āĻžāĻĒ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻ¨ āĻāĻ°ā§āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻ° āĻ āĻāĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻāĻŽāĻŋ āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ°ā§āĻ§ā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻĒāĻ°ā§āĻā§āĻˇāĻžāĻ āĻĒāĻ°āĻŋāĻāĻžāĻ˛āĻ¨āĻž āĻāĻ°ā§āĻāĻŋ āĻ¯ā§āĻŽāĻ¨:
g.V().hasLabel('ZoneStep').has('id',0)
.repeat(__.out().simplePath()).until(__.hasLabel('ZoneStep').has('id',1)).count().next()
āĻ¯āĻž āĻšāĻžāĻāĻāĻžāĻ° āĻĻā§āĻ°āĻ¤ā§āĻŦ āĻĒā§āĻ°āĻ¤āĻŋāĻĢāĻ˛āĻŋāĻ¤ āĻāĻ°ā§āĨ¤ āĻ¯āĻžāĻāĻšā§āĻ, āĻāĻŽāĻ¨āĻāĻŋ āĻāĻ āĻ§āĻ°āĻ¨ā§āĻ° āĻĄā§āĻāĻžāĻ¤ā§āĻ, āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸ āĻāĻŽāĻ¨ āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻĻā§āĻāĻŋāĻ¯āĻŧā§āĻā§ āĻ¯āĻž āĻāĻ¯āĻŧā§āĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ° āĻŦā§āĻļāĻŋ āĻāĻ˛ā§ āĻā§āĻā§... āĻāĻāĻŋ āĻ
āĻŦāĻļā§āĻ¯āĻ āĻāĻ āĻāĻžāĻ°āĻŖā§ āĻ¯ā§ āĻ¸ā§āĻāĻžāĻ¨ā§ āĻĒāĻĨ āĻāĻŋāĻ˛ 0 -> X -> Y ... -> 1
, āĻ¯āĻž āĻā§āĻ°āĻžāĻĢ āĻāĻā§āĻāĻŋāĻ¨āĻ āĻĒāĻ°ā§āĻā§āĻˇāĻž āĻāĻ°ā§āĻā§āĨ¤
āĻāĻŽāĻ¨āĻāĻŋ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻļā§āĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¯ā§āĻŽāĻ¨:
g.V().hasLabel('ZoneStep').has('id',0).out().has('id',1)).count().next()
āĻāĻŽāĻŋ āĻāĻ āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§āĻ°āĻ āĻāĻŽ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻāĻ¤ā§āĻĒāĻžāĻĻāĻ¨āĻļā§āĻ˛ āĻĒā§āĻ°āĻ¤āĻŋāĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ¤ā§ āĻ āĻā§āĻˇāĻŽ āĻāĻŋāĻ˛āĻžāĻŽāĨ¤
āĻāĻ˛ā§āĻĒā§āĻ° āĻ¨ā§āĻ¤āĻŋāĻāĻ¤āĻž āĻšāĻ˛ āĻ¯ā§ āĻāĻāĻāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ§āĻžāĻ°āĻŖāĻž āĻāĻŦāĻ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤āĻŽā§āĻ˛āĻ āĻŽāĻĄā§āĻ˛āĻŋāĻ āĻĒāĻāĻ¨ā§āĻĻāĻ¸āĻ āĻĢāĻ˛āĻžāĻĢāĻ˛ā§āĻ° āĻĻāĻŋāĻā§ āĻ¨āĻŋāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧ āĻ¨āĻž, āĻ¯āĻž āĻā§āĻ˛āĻŋāĻāĻšāĻžāĻāĻ¸ā§āĻ° āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻ āĻ¨ā§āĻ āĻŦā§āĻļāĻŋ āĻĻāĻā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻāĻ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§ āĻāĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻŋāĻ¤ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻā§āĻ°āĻžāĻĢ āĻĄāĻŋāĻŦāĻŋāĻāĻŽāĻāĻ¸-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸ā§āĻĒāĻˇā§āĻ āĻŦāĻŋāĻ°ā§āĻ§ā§ āĻĒā§āĻ¯āĻžāĻāĻžāĻ°ā§āĻ¨, āĻ¯āĻĻāĻŋāĻ āĻāĻāĻŋ āĻ¤āĻžāĻĻā§āĻ° āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ā§ āĻŽāĻĄā§āĻ˛āĻŋāĻāĻ¯āĻŧā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĻ¤ āĻŦāĻ˛ā§ āĻŽāĻ¨ā§ āĻšāĻ¯āĻŧāĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com